7. 扩展distutils

注解

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

distutils可以以各种方式扩展。大多数扩展采用新命令或现有命令的替换形式。例如,可以编写新的命令来支持新的平台特定的打包类型,而可以替换现有的命令来修改命令如何在包上操作的详细信息。

distutils的大多数扩展都是在 setup.py 要修改现有命令的脚本;许多脚本只需添加一些文件扩展名,除了 .py 方便的文件。

大多数distutils命令实现都是 distutils.cmd.Command 类。新命令可以直接从继承 Command ,而替换通常源于 Command 间接地,直接子类化它们要替换的命令。命令必须派生自 Command .

7.1. 集成新命令

有不同的方法可以将新的命令实现集成到distuils中。最困难的是游说将新特性包含在distutils本身中,并等待(并且需要)提供这种支持的Python版本。这真的很难,原因很多。

对于大多数需求,最常见的,也可能是最合理的,是将新的实现包括在 setup.py 脚本,并导致 distutils.core.setup() 函数使用它们:

from distutils.command.build_py import build_py as _build_py
from distutils.core import setup

class build_py(_build_py):
    """Specialized Python source builder."""

    # implement whatever needs to be different...

setup(cmdclass={'build_py': build_py},
      ...)

如果必须使用新的实现来使用特定的包,那么这种方法是最有价值的,因为对包感兴趣的每个人都需要新的命令实现。

从python 2.4开始,第三个选项是可用的,目的是允许添加新的命令,这些命令可以支持现有的 setup.py 不需要修改python安装的脚本。这将允许第三方扩展为额外的打包系统提供支持,但是命令可以用于distutils命令可以用于的任何内容。一个新的配置选项, command_packages (命令行选项 --command-packages )可用于指定要搜索的其他包,以查找实现命令的模块。与所有distutils选项一样,这可以在命令行或配置文件中指定。此选项只能在 [global] 配置文件的一部分,或在命令行上的任何命令之前。如果在配置文件中设置,则可以从命令行中重写;在命令行中将其设置为空字符串将使用默认值。永远不应在随包提供的配置文件中设置此项。

此新选项可用于将任意数量的包添加到搜索到命令实现的包列表中;多个包名称应以逗号分隔。如果未指定,则仅在 distutils.command 包裹。什么时候? setup.py 使用选项运行 --command-packages distcmds,buildcmds 但是,这些包 distutils.commanddistcmdsbuildcmds 将按该顺序搜索。新命令应该由共享相同名称的类在与命令同名的模块中实现。给定上面的示例命令行选项,命令 bdist_openpkg 可以由类实现 distcmds.bdist_openpkg.bdist_openpkgbuildcmds.bdist_openpkg.bdist_openpkg .

7.2. 添加新的分发类型

创建分发的命令(在 dist/ 目录)需要添加 (command, filename) 配对对 self.distribution.dist_files 以便 upload 可以上传到pypi。这个 filename 在该对中不包含路径信息,只包含文件本身的名称。在干运行模式下,仍应添加对以表示将要创建的内容。