On this page
1. Distutils 简介
Note
该文档将一直保留,直到https://setuptools.readthedocs.io/en/latest/setuptools.html的setuptools
文档独立涵盖了此处当前包括的所有相关信息。
本文档介绍如何使用 Distutils 分发 Python 模块,并着重于开发人员/分发者的角色:如果要查找有关安装 Python 模块的信息,请参考安装 Python 模块(旧版)章。
1.1. 概念与术语
对于模块开发人员和安装第三方模块的用户/Management 员而言,使用 Distutils 都非常简单。作为开发人员,您的责任(当然,除了编写可靠,记录良好和经过测试的代码!):
编写安装脚本(按惯例
setup.py
)(可选)写入设置配置文件
创建源分发
(可选)创建一个或多个内置(二进制)发行版
本文档介绍了这些任务中的每一个。
并非所有的模块开发人员都可以使用多种平台,因此,期望他们创建多种内置发行版并不总是可行的。希望会出现一类称为包装商的中介机构来解决这一需求。打包人员将获取由模块开发人员发布的源发行版,在一个或多个平台上构建它们,然后发布生成的内置发行版。因此,最流行平台上的用户将能够以最自然的方式为其平台安装最流行的 Python 模块发行版,而不必运行单个安装脚本或编译一行代码。
1.2. 一个简单的例子
安装脚本通常非常简单,尽管由于它是用 Python 编写的,所以对它的操作没有任何限制,尽管您应谨慎地在安装脚本中放置任意昂贵的操作。与 Autoconf 风格的配置脚本不同,在构建和安装模块发行版的过程中,安装脚本可能会多次运行。
如果您要做的就是分发名为foo
的模块,该模块包含在文件foo.py
中,那么您的安装脚本可以像这样简单:
from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)
Some observations:
您提供给 Distutils 的大多数信息都作为
setup()
函数的关键字参数提供这些关键字参数分为两类:包元数据(名称,版本号)和有关包中内容的信息(在这种情况下为纯 Python 模块列表)
模块是由模块名称而不是文件名指定的(软件包和 extensions 也是如此)
建议您提供更多的元数据,尤其是您的姓名,电子邮件地址和项目的 URL(有关示例,请参见编写安装脚本部分)
要为此模块创建源分发,您将创建一个包含以上代码的安装脚本setup.py
,并从终端运行以下命令:
python setup.py sdist
对于 Windows,打开命令提示符窗口(开始‣附件)并将命令更改为:
setup.py sdist
sdist 将创建一个包含安装脚本setup.py
和模块foo.py
的存档文件(例如,Unix 上的 tarball,Windows 上的 ZIP 文件)。存档文件将被命名为foo-1.0.tar.gz
(或.zip
),并将解压缩到目录foo-1.0
中。
如果finally用户希望安装foo
模块,那么他们要做的就是下载foo-1.0.tar.gz
(或.zip
),解压缩并从foo-1.0
目录运行
python setup.py install
finally会将foo.py
复制到第三方模块在其 Python 安装中的适当目录中。
这个简单的示例演示了 Distutils 的一些基本概念。首先,开发人员和安装人员都具有相同的基本用户界面,即安装脚本。区别在于它们使用的是 Distutils 命令:sdist 命令几乎专门用于模块开发人员,而 install **对于安装人员来说更常见(尽管大多数开发人员会偶尔安装自己的代码)。
如果您想让用户 true 轻松,可以为他们创建一个或多个内置发行版。例如,如果您在 Windows 计算机上运行,并且想让其他 Windows 用户更轻松,则可以使用 bdist_wininst 命令创建可执行安装程序(该平台最适合的内置发行版类型)。例如:
python setup.py bdist_wininst
将在当前目录中创建一个可执行安装程序foo-1.0.win32.exe
。
其他有用的内置分发格式是 RPM,由 bdist_rpm 命令,Solaris pkgtool ( bdist_pkgtool )和 HP-UX swinstall ( bdist_sdux )实现。例如,以下命令将创建一个名为foo-1.0.noarch.rpm
的 RPM 文件:
python setup.py bdist_rpm
( bdist_rpm 命令使用 rpm 可执行文件,因此必须在基于 RPM 的系统(例如 Red Hat Linux,SuSE Linux 或 Mandrake Linux)上运行。)
您可以pass运行来随时查找可用的分发格式
python setup.py bdist --help-formats
1.3. 通用 Python 术语
如果您正在阅读本文档,则可能对什么模块,扩展等有所了解。不过,为了确保每个人都从一个共同的起点开始工作,我们提供以下 Python 通用术语表:
module
- Python 中代码可重用性的基本单位:由其他一些代码导入的代码块。这里涉及到三种类型的模块:纯 Python 模块,扩展模块和包。
纯 Python 模块
- 用 Python 编写并包含在单个
.py
文件(可能还有相关的.pyc
文件)中的模块。有时称为“纯模块”。
- 用 Python 编写并包含在单个
extension module
- 用 Python 实现的底层语言编写的模块:Python 的 C/C,Jython 的 Java。通常包含在单个可动态加载的预编译文件中,例如 Unix 上用于 Python 扩展的共享对象(
.so
)文件,Windows 上用于 Python 扩展的 DLL(给.pyd
extensions)或 Jython 扩展的 Java 类文件。 (请注意,当前,Distutils 仅处理 Python 的 C/C 扩展.)
- 用 Python 实现的底层语言编写的模块:Python 的 C/C,Jython 的 Java。通常包含在单个可动态加载的预编译文件中,例如 Unix 上用于 Python 扩展的共享对象(
package
- 包含其他模块的模块;通常包含在文件系统的目录中,并pass文件
__init__.py
与其他目录区分开。
- 包含其他模块的模块;通常包含在文件系统的目录中,并pass文件
root package
- 包层次结构的根。 (这实际上不是软件包,因为它没有
__init__.py
文件.但是我们必须称呼它.)绝大多数标准库都在根软件包中,许多小型独立第三方也是如此。不属于较大模块集合的模块。与常规软件包不同,根软件包中的模块可以在许多目录中找到:实际上,sys.path
中列出的每个目录都将模块添加到根软件包中。
- 包层次结构的根。 (这实际上不是软件包,因为它没有
1.4. Distutils 专用术语
以下术语更具体地适用于使用 Distutils 分发 Python 模块的领域:
module distribution
- Python 模块的集合,这些模块作为单个可下载资源一起分发,并且打算大规模安装。一些众所周知的模块分布的示例是 NumPy,SciPy,Pillow 或 mxBase。 (这将称为* package *,除了该术语已在 Python 上下文中使用:单个模块分发可能包含零个,一个或多个 Python 软件包.)
纯模块分配
- 一个仅包含纯 Python 模块和软件包的模块发行版。有时称为“纯分布”。
非纯模块分配
- 包含至少一个扩展模块的模块分发。有时也称为“非纯分布”。
distribution root
- 您的源代码树(或源代码分发)的顶级目录;
setup.py
所在的目录。通常,setup.py
将在此目录中运行。
- 您的源代码树(或源代码分发)的顶级目录;