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 风格手册页的blib/man/,用于 GNU info 文档的blib/info/,和/或用于(你猜对了)HTML 文档的blib/html/。
- build_py
- 执行 make_blib;将.py文件复制到“共享”blib目录(如果它们属于包,则复制到其子目录),并将其编译为.pyc和.pyo形式。
- build_extensions
- 执行 make_blib;编译辅助 C 文件(那些不提供扩展模块本身,但为了正在构建的扩展能工作而必需的);编译扩展 C 文件;链接辅助和扩展 C 文件(以及任何所需的外部库)以在特定于架构的blib目录中创建动态库(例如 Unix 的.so文件,Windows 的 DLL 等)
- build_doc
- 将文档处理成可安装的形式,放到 ./blib下的某个位置,例如 *roff 格式的手册页、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)复制到特定于架构的安装目录;将处理后的文档(手册页、Info 文件等)复制到文档安装目录。(也许这应该拆分为install_py、install_extensions和install_doc?)
