3. 正在写入安装程序配置文件

注解

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

通常,不可能写下构建分发所需的所有内容 先验的 :您可能需要从用户或用户系统获取一些信息才能继续。只要信息相当简单——例如搜索C头文件或库的目录列表——然后提供一个配置文件, setup.cfg 对于用户来说,编辑是一种既便宜又容易的方法。配置文件还允许您为任何命令选项提供默认值,然后安装程序可以在命令行上或通过编辑配置文件来覆盖该选项。

安装程序配置文件是安装程序脚本之间的一个有用的中间位置,理想情况下,安装程序不了解它。 1 ---以及安装脚本的命令行,它不在您的控制范围内,完全由安装程序决定。事实上, setup.cfg (以及目标系统上存在的任何其他distuils配置文件)在安装脚本的内容之后,但在命令行之前进行处理。这有几个有用的结果:

  • 安装程序可以覆盖您输入的某些内容 setup.py 通过编辑 setup.cfg

  • 您可以为不容易在中设置的选项提供非标准默认值。 setup.py

  • 安装程序可以覆盖 setup.cfg 使用命令行选项 setup.py

配置文件的基本语法很简单:

[command]
option=value
...

在哪里? 命令 是distutils命令之一(例如 build_pyinstalloption 是命令支持的选项之一。可以为每个命令提供任意数量的选项,文件中可以包含任意数量的命令节。空白行将被忽略,注释也是如此,它们从 '#' 字符,直到行尾。长选项值可以通过缩进连续行跨多行拆分。

您可以通过Universal找到特定命令支持的选项列表 --help 选项,例如

$ python setup.py --help build_ext
[...]
Options for 'build_ext' command:
  --build-lib (-b)     directory for compiled extension modules
  --build-temp (-t)    directory for temporary files (build by-products)
  --inplace (-i)       ignore build-lib and put compiled extensions into the
                       source directory alongside your pure Python modules
  --include-dirs (-I)  list of directories to search for header files
  --define (-D)        C preprocessor macros to define
  --undef (-U)         C preprocessor macros to undefine
  --swig-opts          list of SWIG command line options
[...]

注意,一个选项拼写为 --foo-bar 命令行上的拼写 foo_bar 在配置文件中。

例如,假设您希望扩展被“就地”构建,也就是说,您有一个扩展 pkg.ext ,您需要编译的扩展文件 (ext.so 在Unix上,假设)与纯Python模块放在同一个源目录中 pkg.mod1pkg.mod2 . 你可以一直使用 --inplace 命令行上的选项,以确保:

python setup.py build_ext --inplace

但这要求您始终指定 build_ext 明确命令,并记住提供 --inplace . 一种更简单的方法是“设置并忽略”此选项,方法是将其编码为 setup.cfg ,此分发的配置文件:

[build_ext]
inplace=1

这将影响此模块分发的所有版本,无论您是否明确指定 build_ext . 如果你包括 setup.cfg 在源代码发行版中,它还会影响最终用户的构建——这对于这个选项来说可能是个坏主意,因为在适当的地方构建扩展会破坏模块发行版的安装。不过,在某些特殊情况下,模块是在其安装目录中构建的,因此这是一种很有用的能力。(不过,分发希望在安装目录中构建的扩展几乎总是一个坏主意。)

另一个例子是:某些命令有很多选项,它们在运行时不会发生变化;例如, bdist_rpm 需要知道生成用于创建RPM分发的“spec”文件所需的所有信息。其中一些信息来自安装脚本,一些信息由distuils自动生成(例如安装的文件列表)。但其中一些必须作为选择提供给 bdist_rpm 在命令行上执行每一次运行都会非常繁琐。因此,下面是distutils自己的代码片段 setup.cfg

[bdist_rpm]
release = 1
packager = Greg Ward <gward@python.net>
doc_files = CHANGES.txt
            README.txt
            USAGE.txt
            doc/
            examples/

请注意 doc_files 选项只是一个空格分隔的字符串,跨多行拆分以提高可读性。

参见

配置文件的语法 在“安装python模块”中

有关配置文件的更多信息,请参阅系统管理员手册。

脚注

1

在distutils完全支持自动配置之前,这种理想可能无法实现。