3. 编写安装程序配置文件

通常,不可能记下构建发行版先验所需的所有内容:您可能需要从用户或用户的系统中获取一些信息才能 continue。只要这些信息非常简单(例如,用于搜索 C 头文件或库的目录列表),然后提供配置文件setup.cfg以便用户进行编辑,便是一种便宜又容易获得的方法。配置文件还允许您为任何命令选项提供默认值,然后安装程序可以在命令行上或pass编辑配置文件来覆盖这些默认值。

安装配置文件是安装脚本(理想情况下对安装程序[1]不透明)和安装脚本的命令行之间的有用中间点,安装脚本不受您的控制,并且完全由安装程序决定。实际上,setup.cfg(以及目标系统上存在的任何其他 Distutils 配置文件)是在安装脚本的内容之后但在命令行之前进行处理的。这有几个有用的后果:

  • 安装人员可以pass编辑setup.cfg覆盖您在setup.py中 Importing 的内容

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

  • 安装程序可以使用setup.py的命令行选项来覆盖setup.cfg中的所有内容

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

[command]
option=value
...

其中* command 是 Distutils 命令之一(例如 build_pyinstall ),而 option *是该命令支持的选项之一。可以为每个命令提供任意数量的选项,并且文件中可以包含任意数量的命令部分。从'#'字符到行尾的空白行以及 Comments 都将被忽略。长选项值可以pass缩进连续行而分为多行。

您可以pass通用--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

例如,假设您希望扩展是“就地”构建的,也就是说,您具有 extensionspkg.ext,并且您希望将已编译的扩展文件(例如,在 Unix 上为ext.so)放在与您相同的源目录中。纯 Python 模块pkg.mod1pkg.mod2。您始终可以在命令行上使用--inplace选项来确保:

python setup.py build_ext --inplace

但这要求您始终明确指定 build_ext 命令,并记住提供--inplace。一种更简单的方法是pass在此分发的配置文件setup.cfg中对其进行编码来“设置并忘记”此选项:

[build_ext]
inplace=1

无论您是否明确指定 build_ext ,这都会影响此模块发行版的所有构建。如果您在源代码发行版中包含setup.cfg,它将也影响finally用户的构建-对于此选项,这可能是个坏主意,因为始终在原地构建扩展会破坏模块发行版的安装。但是,在某些特殊情况下,模块是直接在其安装目录中构建的,因此可以想象这是一种有用的Function。 (不过,分发期望在其安装目录中构建的 extensions 几乎总是一个坏主意.)

再举一个例子:某些命令具有很多选项,它们在运行之间不会改变;例如,bdist_rpm 需要了解生成“ spec”文件以创建 RPM 分发所需的一切.其中的某些信息来自安装脚本,而某些信息则由 Distutils 自动生成(例如,已安装文件的列表).但是其中一些必须作为 bdist_rpm **的选项提供,这对于每次运行都非常繁琐。因此,这是 Distutils 自己的setup.cfg的摘录:

[bdist_rpm]
release = 1
packager = Greg Ward <[email protected]>
doc_files = CHANGES.txt
            README.txt
            USAGE.txt
            doc/
            examples/

请注意,doc_files选项只是用空格分隔的字符串,为了便于阅读,该字符串跨多行分隔。

See also

  • “安装 Python 模块”中的配置文件的语法

  • 系统 Management 员可以在手册中找到有关配置文件的更多信息。

Footnotes

  • [1]
    • 在 Distutils 完全支持自动配置之前,可能无法实现这一理想。