1. distutils简介

注解

本文件仅保留至 setuptools https://setuptools.readthedocs.io/en/latest/setuptools.html上的文档独立地涵盖了此处当前包含的所有相关信息。

本文档介绍如何使用distuils来分发您的python模块,重点介绍开发人员/分发者的角色:如果您要查找有关安装python模块的信息,请参阅 安装python模块(旧版) 章。

1.1. 概念和术语

对于模块开发人员和安装第三方模块的用户/管理员来说,使用distuils非常简单。作为一名开发人员,您的职责(当然,除了编写可靠的、有良好文档记录和经过良好测试的代码之外!)是:

  • 编写安装脚本 (setup.py 按惯例)

  • (可选)写入设置配置文件

  • 创建源分发

  • (可选)创建一个或多个内置(二进制)分发

这些任务中的每一项都包含在本文档中。

并非所有的模块开发人员都可以访问许多平台,因此期望他们创建大量的构建发行版并不总是可行的。希望有一类中介机构 封装工人 将出现以满足这一需求。打包程序将获取模块开发人员发布的源发行版,在一个或多个平台上构建它们,并发布生成的发行版。因此,最流行的平台上的用户将能够以最自然的方式为其平台安装最流行的Python模块发行版,而无需运行单个安装脚本或编译一行代码。

1.2. 一个简单的例子

安装脚本通常非常简单,尽管它是用python编写的,但是对您可以使用它做什么没有任意限制,尽管您应该小心在安装脚本中放置任意昂贵的操作。与autoconf风格的配置脚本不同,安装脚本在构建和安装模块分发过程中可能会多次运行。

如果您只想分发一个名为 foo ,包含在文件中 foo.py ,则安装脚本可以如此简单:

from distutils.core import setup
setup(name='foo',
      version='1.0',
      py_modules=['foo'],
      )

一些观察结果:

  • 提供给distutils的大多数信息都作为关键字参数提供给 setup() 功能

  • 这些关键字参数分为两类:包元数据(名称、版本号)和关于包中内容的信息(本例中是纯Python模块的列表)

  • 模块是由模块名而不是文件名指定的(包和扩展名也是如此)

  • 建议您提供更多的元数据,特别是您的姓名、电子邮件地址和项目的URL(请参见第节 编写安装脚本 例如)

要为此模块创建源分发,您需要创建一个安装脚本, setup.py ,包含上述代码,并从终端运行此命令::

python setup.py sdist

对于Windows,打开命令提示窗口 (Start ‣ Accessories )将命令更改为:

setup.py sdist

sdist 将创建包含安装脚本的存档文件(例如,UNIX上的tarball文件、Windows上的zip文件) setup.py 和您的模块 foo.py . 将命名存档文件 foo-1.0.tar.gz (或) .zip ,并将解包到一个目录中 foo-1.0 .

如果最终用户希望安装 foo 模块,他们要做的就是下载 foo-1.0.tar.gz (或) .zip ,打开封装,然后---从 foo-1.0 目录---运行:

python setup.py install

最终会复制 foo.py 到第三方模块在其python安装中的相应目录。

这个简单的例子演示了distuils的一些基本概念。首先,开发人员和安装人员都有相同的基本用户界面,即安装脚本。区别在于哪一个distutils 命令 他们使用: sdist 命令几乎只针对模块开发人员,而 install 对于安装人员来说更常见(尽管大多数开发人员偶尔希望安装自己的代码)。

其他有用的内置分发格式是RPM,由 bdist_rpm 命令,Solaris pkgtool (bdist_pkgtool )和HPUX swinstall (bdist_sdux )例如,下面的命令将创建一个名为 foo-1.0.noarch.rpm ::

python setup.py bdist_rpm

(The bdist_rpm 命令使用 rpm 因此,这必须在基于RPM的系统上运行,如Red Hat Linux、SuSE Linux或Mandrake Linux。)

您可以通过运行以下命令随时了解可用的分发格式:

python setup.py bdist --help-formats

1.3. python通用术语

如果您正在阅读此文档,您可能对哪些模块、扩展等有很好的了解。不过,为了确保每个人都从一个共同的起点开始操作,我们提供了以下常见的Python术语表:

模块

Python中代码可重用性的基本单位:由其他代码导入的代码块。这里涉及到三种类型的模块:纯Python模块、扩展模块和包。

纯python模块

用python编写并包含在单个 .py 文件(可能与 .pyc 文件)。有时被称为“纯模块”。

扩展模块

一个用Python实现的低级语言编写的模块:Python的C/C++,Jython的Java。通常包含在单个可动态加载的预编译文件中,例如共享对象 (.so )在Unix上用于python扩展的文件,一个dll(给定 .pyd 在Windows上的Python扩展,或者Jython扩展的Java类文件。(注意,目前,ditudil只处理Python的C/C++扩展。)

包裹

包含其他模块的模块;通常包含在文件系统中的一个目录中,并通过文件的存在与其他目录区分开来。 __init__.py .

根包

包层次结构的根。(这不是真正的包裹,因为它没有 __init__.py 文件。但是我们必须称之为某种东西。)大多数标准库都在根包中,许多不属于更大模块集合的小型独立第三方模块也在根包中。与常规包不同,根包中的模块可以在许多目录中找到:实际上,在 sys.path 向根包提供模块。

1.4. distuils特定术语

以下术语更具体地适用于使用distutils分发python模块的域:

模块分配

作为一个可下载资源分发在一起并打算安装的一组python模块。 全体 . 一些众所周知的模块分布的例子有numpy、scipy、bellow或mxbase。(这称为 包裹 ,但该术语已经在Python上下文中使用:单个模块分发可能包含零个、一个或多个Python包。)

纯模块分配

只包含纯Python模块和包的模块分发。有时被称为“纯分布”。

非纯模块分配

包含至少一个扩展模块的模块分发。有时被称为“非纯分布”。

分布根

源码树(或源分发)的顶级目录;其中 setup.py 存在。一般来说 setup.py 将从此目录运行。