On this page
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_py , install ),而 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.mod1
和pkg.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 <gward@python.net>
doc_files = CHANGES.txt
README.txt
USAGE.txt
doc/
examples/
请注意,doc_files
选项只是用空格分隔的字符串,为了便于阅读,该字符串跨多行分隔。
See also
“安装 Python 模块”中的配置文件的语法
系统 Management 员可以在手册中找到有关配置文件的更多信息。
Footnotes
- [1]
- 在 Distutils 完全支持自动配置之前,可能无法实现这一理想。