3. 配置 Python¶
3.1. 配置参数¶
用以下方式列出脚本 ./configure 的所有参数:
./configure --help
参阅 Python 源代码中的 Misc/SpecialBuilds.txt 。
3.1.1. 常用参数¶
-
--enable-loadable-sqlite-extensions¶ 支持
_sqlite扩展模块中的可加载扩展(默认为否)。参见
sqlite3.Connection.enable_load_extension()方法的sqlite3模块。3.6 新版功能.
-
--enable-big-digits=[15|30]¶ 定义 Python
int数字的比特大小:15或30比特默认情况下,比特数取决于
sizeof(void*)。如果void*大小为 64 位以上,则比特数为 30 位,否则为 15 位。定义
PYLONG_BITS_IN_DIGIT为15或30。
-
--with-cxx-main¶
-
--with-cxx-main=COMPILER¶ 编译 Python
main()函数,用 C++ 编译器链接 Python 可执行文件: $CXX` 或 COMPILER。
-
--with-suffix=SUFFIX¶ 将 Python 的可执行文件后缀设置为 SUFFIX。
在 Windows 和 macOS 上的默认后缀为
.exe``( ``python.exe为可执行文件),在其他平台上为空字符串(python可执行)。
-
--with-tzpath=<list of absolute paths separated by pathsep>¶ 为
zoneinfo.TZPATH选择默认的时区搜索路径。 参见zoneinfo模块的 编译时配置。默认:
/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo参阅
os.pathsep路径分隔符。3.9 新版功能.
-
--without-decimal-contextvar¶ 编译
_decimal扩展模块时使用线程本地上下文,而不是协程本地上下文(默认),参见decimal模块。参见
decimal.HAVE_CONTEXTVAR和contextvars模块。3.9 新版功能.
-
--without-c-locale-coercion¶ 禁用 C 语言对 UTF-8 的强制要求(默认为启用)。
不定义
PY_COERCE_C_LOCALE宏。参阅
PYTHONCOERCECLOCALE和 PEP 538。
-
--with-platlibdir=DIRNAME¶ Python 库目录名(默认为
lib)。Fedora 和 SuSE 在64 位平台用
lib64。参阅
sys.platlibdir。3.9 新版功能.
3.1.2. 安装时的选项¶
3.1.3. 性能选项¶
建议用 --enable-optimizations --with-lto (PGO + LTO)配置 Python,以便实现最佳性能。
-
--enable-optimizations¶ 用
PROFILE_TASK启用以配置文件主导的优化(PGO)(默认为禁用)。C 编译器 Clang 需要用到
llvm-profdata程序进行 PGO。在 macOS 上,GCC 也需要用到它:在 macOS 上 GCC 只是 Clang 的别名而已。如果使用
--enable-shared和 GCC ,还可以禁用 libpython 中的语义插值:在编译器和链接器的标志中加入-fno-semantic-interposition。3.6 新版功能.
在 3.10 版更改: 在 GCC 上使用
-fno-semantic-interposition。
-
PROFILE_TASK¶ Makefile 用到的环境变量:PGO 用到的 Python 命令行参数。
默认为:
-m test --pgo --timeout=$(TESTTIMEOUT)。3.8 新版功能.
-
--with-lto¶ 在编译过程中启用链接时间优化(LTO)(默认为禁用)。
LTO 时 C 编译器 Clang 需要用到
llvm-ar参数(在 macOS 则为ar),以及支持 LTO 的链接器(ld.gold或lld)。3.6 新版功能.
-
--with-computed-gotos¶ 在求值环节启用 goto 计数(在支持的编译器上默认启用)。
-
--without-pymalloc¶ 禁用特定的 Python 内存分配器 pymalloc (默认为启用)。
参见环境变量
PYTHONMALLOC。
-
--without-doc-strings¶ 禁用静态文档字符串以减少内存占用(默认启用)。Python 中定义的文档字符串不受影响。
不定义
PY_COERCE_C_LOCALE宏。参阅宏
PyDoc_STRVAR()。
-
--enable-profiling¶ 用
gprof启用 C 语言级的代码评估(默认为禁用)。
3.1.4. Python 调试级编译¶
调试版本 Python 是指带有 --with-pydebug 参数的编译。
调试版本的效果:
默认显示所有警告:在
warnings模块中,默认警告过滤器的列表是空的。在
sys.abiflags中加入d标记。加入
sys.gettotalrefcount()函数。命令行参数加入
-X showrefcount。环境变量加入
PYTHONTHREADDEBUG。加入对
__ltrace__变量的支持:如果定义了该变量,在计算字节码环节启用底层跟踪。安装 内存分配调试钩子 ,以便检测缓冲区溢出和其他内存错误。
定义宏
Py_DEBUG和Py_REF_DEBUG。加入运行时检查:针对
#ifdef Py_DEBUG和#endif包裹的代码。启用assert(...)和_PyObject_ASSERT(...)断言:不设置NDEBUG宏(参阅--with-assertions参数)。主要的运行检查包括:增加了对函数参数的合理性检查。
创建 Unicode 和 int 对象时,内存按某种模式进行了填充,用于检测是否使用了未初始化的对象。
确保有能力清除或替换当前异常的函数在调用时不会引发异常。
垃圾收集器(
gc.collect()函数)对对象的一致性进行一些基本检查。从较宽类型转换到较窄类型时,
Py_SAFE_DOWNCAST()宏会检查整数下溢和上溢的情况。
参见 Python 开发模式 和配置参数 --with-trace-refs 。
在 3.8 版更改: 发布版和调试版的编译现在是 ABI 兼容的:定义了 Py_DEBUG 宏不再意味着同时定义了 Py_TRACE_REFS 宏(参见 --with-trace-refs 参数),这引入了唯一一处不是 ABI 兼容的地方。
3.1.5. 调试选项¶
-
--with-pydebug¶ 在调试模式下编译 Python: 定义宏
Py_DEBUG(默认为禁用)。
-
--with-trace-refs¶ 为了调试而启用引用的跟踪(默认为禁用)。
效果如下:
定义
Py_TRACE_REFS宏。加入
sys.getobjects()函数。环境变量加入
PYTHONDUMPREFS。
此版本与发布模式(默认编译模式)或调试模式(
Py_DEBUG和Py_REF_DEBUG宏)不具备 ABI 兼容性。3.8 新版功能.
-
--with-assertions¶ 编译时启用 C 断言:
assert(...);和_PyObject_ASSERT(...);(默认不启用)。如果设置此参数,则在
OPT编译器变量中不定义NDEBUG宏。参阅
--with-pydebug选项(调试编译模式),它也可以启用断言。3.6 新版功能.
-
--with-valgrind¶ 启用 Valgrind (默认禁用)。
-
--with-dtrace¶ 启用 DTrace(默认禁用)。
参阅 用 DTrace 和 SystemTap 测试 CPython。
3.6 新版功能.
-
--with-address-sanitizer¶ 启用 AddressSanitizer 内存错误检测
asan,(默认为禁用)。3.6 新版功能.
-
--with-memory-sanitizer¶ 启用 MemorySanitizer 内存错误检测
msan,(默认为禁用)。3.6 新版功能.
-
--with-undefined-behavior-sanitizer¶ 启用 undefinedBehaviorSanitizer 未定义行为检测
ubsan,(默认为禁用)。3.6 新版功能.
3.1.6. 链接器选项¶
启用共享 Python 库
libpython的编译(默认为禁用)。
-
--without-static-libpython¶ 不编译
libpythonMAJOR.MINOR.a,也不安装python.o(默认会编译并安装)。3.10 新版功能.
3.1.7. 库选项¶
-
--with-libs='lib1 ...'¶ 链接附加库(默认不会)。
-
--with-system-expat¶ 用已安装的
expat库编译pyexpat模块(默认为否)。
-
--with-tcltk-includes='-I...'¶ 覆盖 Tcl 和 Tk 包含文件的搜索路径。
-
--with-tcltk-libs='-L...'¶ 覆盖 Tcl 和 Tk 库的搜索路径。
-
--with-libm=STRING¶ 将
libm数学库覆盖为 STRING (默认情况视系统而定)。
-
--with-libc=STRING¶ 将
libcC 库覆盖为 STRING (默认情况视系统而定)。
-
--with-openssl=DIR¶ OpenSSL 的根目录。
3.7 新版功能.
-
--with-openssl-rpath=[no|auto|DIR]¶ 设置 OpenSSL 库的运行时库目录(rpath)。
no(默认): 不设置 rpath。auto:根据--with-openssl和pkg-config自动检测 rpath。DIR :直接设置 rpath。
3.10 新版功能.
3.1.8. 安全性选项¶
-
--with-hash-algorithm=[fnv|siphash24]¶ 选择
Python/pyhash.c采用的哈希算法。siphash24(默认)。fnv。
3.4 新版功能.
-
--with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2¶ 内置哈希模块:
md5。sha1。sha256。sha512。sha3(带 shake)。blake2。
3.9 新版功能.
3.1.9. macOS 选项¶
参见 Mac/README.rst 。
-
--enable-universalsdk¶
-
--enable-universalsdk=SDKDIR¶ 创建通用的二进制版本。SDKDIR 指定应采用的 macOS SDK (默认为否)。
-
--enable-framework¶
-
--enable-framework=INSTALLDIR¶ 创建 Python.framework ,而不是传统的 Unix 安装版。可选参数 INSTALLDIR 指定了安装路径((默认为否)。
-
--with-universal-archs=ARCH¶ 指定应创建何种通用二进制文件。该选项仅当设置了
--enable-universalsdk时才有效。可选项:
universal2。32-bit。64-bit。3-way。intel。intel-32。intel-64。all。
-
--with-framework-name=FRAMEWORK¶ 为 macOS 中的 python 框架指定名称,仅当设置了
--enable-framework时有效(默认:Python)。
3.2. Python 构建系统¶
3.2.1. 构建系统的主要文件¶
configure.ac=>configure;Makefile.pre.in=>Makefile(由configure创建);pyconfig.h(由configure创建);Modules/Setup: 由Makefile 使用Module/makesetupshell 脚本构建的 C 扩展;setup.py: 使用distutils模块构建的 C 扩展。
3.2.2. 主要构建步骤¶
C文件(
.c)是作为对象文件(.o)构建的。一个静态库
libpython(.a)是由对象文件创建的。python.o和静态库libpython被链接到最终程序python中。C 扩展由 Makefile (参见
Modules/Setup) 和python setup.py build构建。
3.2.3. 主要 Makefile 目标¶
make:用标准库构建Python。make platform::构建python程序,但不构建标准库扩展模块。make profile-opt:使用 Profile Guided Optimization (PGO) 构建 Python 。你可以使用 configure 的--enable-optimizations选项来使其成为make命令的默认目标(make all或只是make)。make buildbottest:构建 Python 并运行 Python 测试套件,与 buildbots 测试 Python 的方式相同。设置变量TESTTIMEOUT(单位:秒)来改变测试超时时间(默认为 1200 即 20 分钟)。make install:构建并安装 Python 。make regen-all:重新生成(几乎)所有生成的文件;make regen-stdlib-module-names和autoconf必须对其余生成的文件单独运行。make clean:移除构建的文件。make distclean:与make clean相同,但也删除由配置脚本创建的文件。
3.2.4. C 扩展¶
一些 C 扩展是作为内置模块构建的,比如模块 sys 。它们是在定义了宏 Py_BUILD_CORE_BUILTIN 的情况下构建的。内置模块没有 __file__ 属性:
>>> import sys
>>> sys
<module 'sys' (built-in)>
>>> sys.__file__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'sys' has no attribute '__file__'
其他的 C 扩展是作为动态库构建的,就像 _asyncio 模块一样。 它们是在定义了 Py_BUILD_CORE_MODULE 宏的情况下构建的。 在 Linux x86-64 上的例子:
>>> import _asyncio
>>> _asyncio
<module '_asyncio' from '/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'>
>>> _asyncio.__file__
'/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'
Modules/Setup 用于生成 Makefile 目标,以构建 C 扩展。在文件的开头, C 被构建为内置模块。在标记 *shared* 之后定义的扩展被构建为动态库。
setup.py 脚本只使用 distutils 模块将 C 构建为共享库。
宏 PyAPI_FUNC() , PyAPI_API() 和 PyMODINIT_FUNC() 在 Include/pyport.h 中的定义不同,取决于是否定义宏 Py_BUILD_CORE_MODULE 。
如果
Py_BUILD_CORE_MODULE定义了,使用Py_EXPORTED_SYMBOL。否则使用
Py_IMPORTED_SYMBOL。
如果宏 Py_BUILD_CORE_BUILTIN 被错误地用在作为共享库构建的 C 扩展上,它的函数 PyInit_xxx() 就不会被导出,导致导入时出现 ImportError 。
3.3. 编译器和链接器的标志¶
脚本 ./configure 和环境变量设置的选项,并被 Makefile 使用。
3.3.1. 预处理器的标志¶
-
CPPFLAGS¶ ( Objective ) C/C++ 预处理器标志,例如,使用
-I<include dir>如果你的头文件在一个非标准的目录<include dir>中 、CPPFLAGS和LDFLAGS都需要包含shell的值,以便 setup.py 能够使用环境变量中指定的目录构建扩展模块。
-
BASECPPFLAGS¶ 3.4 新版功能.
-
PY_CPPFLAGS¶ 为构建解释器对象文件增加了额外的预处理器标志。
默认为:
$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)。3.2 新版功能.
3.3.2. 编译器标志¶
-
CC¶ C 编译器指令。
例如:
gcc -pthread。
-
MAINCC¶ C编译器命令用于构建像
python这样的程序的main()函数。由配置脚本的
--with-cxx-main选项设置的变量。默认为:
$(CC)。
-
CXX¶ C++ 编译器指令。
如果使用了
--with-cxx-main选项,则使用。例如:
g++ -pthread。
-
CFLAGS¶ C 编译器标志。
-
CFLAGS_NODIST¶ CFLAGS_NODIST用于构建解释器和 stdlib C 扩展。当 Python 安装后,编译器标志 不 应该成为 distutilsCFLAGS的一部分时,可以使用它 ( bpo-21121 )。In particular,
CFLAGSshould not contain:the compiler flag -I (for setting the search path for include files). The -I flags are processed from left to right, and any flags in
CFLAGSwould take precedence over user- and package-supplied -I flags.hardening flags such as -Werror because distributions cannot control whether packages installed by users conform to such heightened standards.
3.5 新版功能.
-
EXTRA_CFLAGS¶ 而外的 C 编译器指令。
-
CONFIGURE_CFLAGS_NODIST¶ 变量
CFLAGS_NODIST的值传递给./configure脚本。3.5 新版功能.
-
BASECFLAGS¶ 基础编译器标志。
-
OPT¶ 优化标志。
-
CFLAGS_ALIASING¶ 严格或不严格的别名标志,用于编译
Python/dtoa.c、3.7 新版功能.
-
CCSHARED¶ 用于构建共享库的编译器标志。
例如,
-fPIC在 Linux 和 BSD 上使用。
-
CFLAGSFORSHARED¶ 为构建解释器对象文件增加了额外的 C 标志。
,默认为:
$(CCSHARED),当--enable-shared被使用时,则为空字符串
-
PY_CFLAGS¶ 默认为:
$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)。
-
PY_CFLAGS_NODIST¶ 默认为:
$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal。3.5 新版功能.
-
PY_STDMODULE_CFLAGS¶ 用于构建解释器对象文件的 C 标志。
默认为:
$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)。3.7 新版功能.
-
PY_CORE_CFLAGS¶ 默认为
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE。3.2 新版功能.
-
PY_BUILTIN_MODULE_CFLAGS¶ 编译器标志,将标准库的扩展模块作为内置模块来构建,如
posix模块默认为:
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN。3.8 新版功能.
-
PURIFY¶ Purify 命令。 Purify 是一个内存调试程序。
默认为:空字符串(不使用)。
3.3.3. 链接器标志位¶
-
LINKCC¶ 用于构建如
python和_testembed的程序的链接器命令。默认为:
$(PURIFY) $(MAINCC)。
-
CONFIGURE_LDFLAGS¶ 变量
LDFLAGS的值被传递给./configure脚本。避免指定
CFLAGS,LDFLAGS等,这样用户就可以在命令行上使用它们来追加这些值,而不用触碰到预设的值。3.2 新版功能.
-
LDFLAGS_NODIST¶ LDFLAGS_NODIST的使用方式与CFLAGS_NODIST相同。当 Python 安装后,链接器标志 不 应该成为 distutilsLDFLAGS的一部分时,可以使用它( bpo-35257 )。In particular,
LDFLAGSshould not contain:the compiler flag -L (for setting the search path for libraries). The -L flags are processed from left to right, and any flags in
LDFLAGSwould take precedence over user- and package-supplied -L flags.
-
CONFIGURE_LDFLAGS_NODIST¶ 变量
LDFLAGS_NODIST的值传递给./configure脚本。3.8 新版功能.
-
LDFLAGS¶ 链接器标志,例如,如果你的库在一个非标准的目录
<lib dir>中,则使用-L<lib dir>。CPPFLAGS和LDFLAGS都需要包含shell的值,以便 setup.py 能够使用环境变量中指定的目录构建扩展模块。
-
LIBS¶ 链接器标志,在链接 Python 可执行文件时将库传递给链接器。
例如:
-lrt。
-
LDSHARED¶ 构建一个共享库的命令。
默认为:
@LDSHARED@ $(PY_LDFLAGS)。
-
BLDSHARED¶ 构建共享库
libpython的命令。默认为:
@BLDSHARED@ $(PY_CORE_LDFLAGS)。
-
PY_LDFLAGS¶ 默认为:
$(CONFIGURE_LDFLAGS) $(LDFLAGS)。
-
PY_LDFLAGS_NODIST¶ 默认为:
$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)。3.8 新版功能.
-
PY_CORE_LDFLAGS¶ 用于构建解释器对象文件的链接器标志。
3.8 新版功能.