Python Distutils-SIG:提议的用户界面
Python Distutils-SIG
提议的用户界面
除了确定开发、分发和安装 Python 模块所涉及的常见任务和分工外,“扩展构建之痛”开发者日会议还提出了一个提议的用户界面。该界面的核心思想是,模块开发者将提供一个小的 Python 脚本,为说明目的称为 setup.py
(尽管希望这个惯例能够流行起来!)。这个脚本将包含两个部分:关于模块分发的元数据(名称、版本号、描述等),以某种 Python 代码的形式编写;以及可选的代码,用于检查目标系统并执行任何所需的预构建配置操作。只有元数据是必需的,实际上,预计大多数模块分发(尤其是那些纯粹用 Python 编写的)将只有元数据组件。下面将介绍一些表示元数据的想法。
本文档描述了一个基于我们在开发者日会议上达成一致的界面,但包含更多细节。(其中一些细节可以被解释为实现而不是界面,但在某处指定它是很重要的。)
一旦编写了 setup.py
脚本,开发者、打包者和安装程序都将使用它来执行所有可以自动化的任务(即除了实际编写模块、文档和测试套件之外的所有任务)。这将通过运行带有强制性“命令”参数的 setup.py
来完成,该参数对应于要完成的任务。(纯属巧合,其中许多命令看起来很像传统的 makefile
目标。)
例如,启动构建的命令是 build
。开发人员、打包人员和安装人员(至少是从源分发工作的安装人员)都必须使用以下命令构建模块:
./setup.py build构建完成后,每个人都应该使用
test
命令运行测试套件./setup.py test当他对代码的状态感到满意时,开发人员会想戴上他的第一个打包者帽子并创建一个源分发
./setup.py dist或者他可能想戴上他的另一个打包者帽子并创建一个构建的分发(或者这可以由其他平台的打包者完成)
./setup.py bdist如果打包者正在为支持“智能安装程序”的系统制作构建分发(distutils 也支持!),他可以制作“智能”构建分发,例如,用于使用它的 Linux 发行版的 RPM
./setup.py bdist -rpm(请注意此处使用了特定于命令的选项;例如,假设可以为这些平台找到合适的智能安装工具,则
bdist
命令还应具有启用为 Windows 和 Macintosh 生成“智能”分发的选项。)
现在,您可能想知道每个命令背后真正发生了什么。可以认为,这是一个不属于界面提案的实现细节,但我认为,大多数开发人员、许多打包人员和一些好奇的用户都会倾向于“幕后”看看在构建和安装模块分发时到底发生了什么。(如果出现问题,倒霉的人将不得不了解这个过程!)因此,这是 setup.py
(通过与 distutils 模块的合作)将支持的命令列表以及与每个命令对应的操作
make_blib
- 如果它尚不存在,请在当前目录下创建一个模拟安装树
blib/
。blib/
将包含用于纯 Python 代码(非特定于架构或共享)和已编译代码(特定于架构)的目录,该目录模仿当前机器上系统 Python 库中的目录(这些目录在构建 Python 本身时确定)。例如,make_blib
可能会创建blib/share/
(共享文件)和blib/plat-i86-linux/
(特定于架构的文件)。也可能有文档目录,例如 Unix 风格的 man 页面的blib/man/
、GNU info 文档的blib/info/
和/或(您猜对了)HTML 文档的blib/html/
。 build_py
- 执行
make_blib
;将.py
文件复制到“共享”blib
目录(或其子目录,如果它们属于包),并将它们编译为.pyc
和.pyo
形式。 build_extensions
- 执行
make_blib
;编译辅助 C 文件(那些不提供扩展模块本身,但需要扩展才能工作的 C 文件);编译扩展 C 文件;链接辅助和扩展 C 文件(以及任何需要的外部库),以在特定于架构的blib
目录中创建动态库(例如,Unix 的.so
文件,Windows 的 DLL 等) build_doc
- 将文档处理到
./blib
下的某个可安装形式,例如 *roff 格式的 man 页面、GNU Info、HTML、Windows 帮助等。也许可以在构建 Python 本身时确定所需的文档格式(当然,Python 文档将以该格式提供,在模块文档累积的同一位置)? build
- 执行
build_py
、build_extensions
和build_doc
。(当然,如果不存在适当的输入,则这些操作中的任何一个都不会执行任何操作。) dist
- 创建源分发 ...
bdist
- 创建构建的分发 ...
test
- 查找测试套件并运行它。定义测试套件的一种可能方法:将一堆脚本放在源分发的一个预定义子目录中;然后将使用添加到 Python 库搜索路径中的共享和特定于架构的
blib
目录来执行它们。例如,test
命令可能会搜索test/*.t
,依次执行每个脚本并解释其输出,以确定该系列测试是否成功或失败。 install
- 将
.py
、.pyc
和.pyo
文件复制到共享安装目录(默认设置为 Python 系统库树的站点特定区域);将动态库(共享对象或 DLL)复制到特定于架构的安装目录;将处理过的文档(man 页面、Info 文件等)复制到文档安装目录。(也许应该将其分为install_py
、install_extensions
和install_doc
?)