注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请开启 JavaScript 以获得完整体验。

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_pybuild_extensionsbuild_doc。(当然,如果不存在适当的输入,则这些操作中的任何一个都不会执行任何操作。)
dist
创建源分发 ...
bdist
创建构建的分发 ...
test
查找测试套件并运行它。定义测试套件的一种可能方法:将一堆脚本放在源分发的一个预定义子目录中;然后将使用添加到 Python 库搜索路径中的共享和特定于架构的 blib 目录来执行它们。例如,test 命令可能会搜索 test/*.t,依次执行每个脚本并解释其输出,以确定该系列测试是否成功或失败。
install
.py.pyc.pyo 文件复制到共享安装目录(默认设置为 Python 系统库树的站点特定区域);将动态库(共享对象或 DLL)复制到特定于架构的安装目录;将处理过的文档(man 页面、Info 文件等)复制到文档安装目录。(也许应该将其分为 install_pyinstall_extensionsinstall_doc?)