3. 配置 Python — Python 文档
3. 配置 Python
3.1. 配置选项
使用以下命令列出所有 ./configure 脚本选项:
./configure --help
另请参阅 Python 源代码分发中的 Misc/SpecialBuilds.txt。
3.1.1. 常规选项
- --enable-loadable-sqlite-extensions
支持 [X35X] 扩展模块中的可加载扩展(默认为 no)。
请参阅 sqlite3 模块的 sqlite3.Connection.enable_load_extension() 方法。
3.6 版中的新功能。
- --disable-ipv6
- 禁用 IPv6 支持(如果支持则默认启用),请参阅 socket 模块。
- --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()函数并将 Python 可执行文件与 C++ 编译器链接:$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 版中的新功能。
- --with-dbmliborder=db1:db2:...
覆盖命令以检查 dbm 模块的数据库后端
一个有效的值是一个冒号 (
:) 分隔的字符串和后端名称:ndbm;gdbm;bdb。
- --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 版中的新功能。
- --with-wheel-pkg-dir=PATH
ensurepip 模块使用的轮子包目录(默认没有)。
一些 Linux 分发打包策略建议不要捆绑依赖项。 比如Fedora在
/usr/share/python-wheels/目录下安装wheel包,不安装ensurepip._bundled包。3.10 版中的新功能。
3.1.2. 安装选项
- --disable-test-modules
不要构建或安装测试模块,如 test 包或
_testcapi扩展模块(默认构建和安装)。3.10 版中的新功能。
- --with-ensurepip=[upgrade|install|no]
选择在 Python 安装上运行的 ensurepip 命令:
upgrade(默认):运行python -m ensurepip --altinstall --upgrade命令。install:运行python -m ensurepip --altinstall命令;no:不要运行ensurepip;
3.6 版中的新功能。
3.1.3. 性能选项
建议使用 --enable-optimizations --with-lto (PGO + LTO) 配置 Python 以获得最佳性能。
- --enable-optimizations
使用 PROFILE_TASK 启用配置文件引导优化 (PGO)(默认禁用)。
C 编译器 Clang 需要用于 PGO 的
llvm-profdata程序。 在 macOS 上,GCC 也需要它:GCC 只是 macOS 上 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)(默认禁用)。
C 编译器 Clang 需要用于 LTO 的
llvm-ar(macOS 上的ar),以及支持 LTO 的链接器(ld.gold或lld)。3.6 版中的新功能。
- --with-computed-gotos
- 在评估循环中启用计算的 goto(在支持的编译器上默认启用)。
- --without-pymalloc
禁用专门的 Python 内存分配器 pymalloc(默认启用)。
另见 PYTHONMALLOC 环境变量。
- --without-doc-strings
禁用静态文档字符串以减少内存占用(默认启用)。 Python 中定义的文档字符串不受影响。
不要定义
WITH_DOC_STRINGS宏。请参阅
PyDoc_STRVAR()宏。
- --enable-profiling
- 使用
gprof启用 C 级代码分析(默认禁用)。
3.1.4. Python调试构建
调试版本是使用 --with-pydebug 配置选项构建的 Python。
调试版本的效果:
- 默认显示所有警告:warnings 模块中的默认警告过滤器列表为空。
- 将
d添加到 sys.abiflags。 - 增加
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 断言的情况下构建(默认为 no):
assert(...);和_PyObject_ASSERT(...);。如果设置,
NDEBUG宏不会在 OPT 编译器变量中定义。另请参阅 --with-pydebug 选项(debug build),它也启用断言。
3.6 版中的新功能。
- --with-valgrind
- 启用 Valgrind 支持(默认为 no)。
- --with-dtrace
启用 DTrace 支持(默认为 no)。
请参阅 使用 DTrace 和 SystemTap 检测 CPython。
3.6 版中的新功能。
- --with-address-sanitizer
启用 AddressSanitizer 内存错误检测器,
asan(默认为 no)。3.6 版中的新功能。
- --with-memory-sanitizer
启用 MemorySanitizer 分配错误检测器,
msan(默认为 no)。3.6 版中的新功能。
- --with-undefined-behavior-sanitizer
启用 UndefinedBehaviorSanitizer 未定义行为检测器,
ubsan(默认为 no)。3.6 版中的新功能。
3.1.6. 链接器选项
- --enable-shared
- 启用构建共享 Python 库:
libpython(默认为 no)。
- --without-static-libpython
不要构建
libpythonMAJOR.MINOR.a,也不要安装python.o(默认构建和启用)。3.10 版中的新功能。
3.1.7. 库选项
- --with-libs='lib1 ...'
- 链接其他库(默认为否)。
- --with-system-expat
- 使用已安装的
expat库(默认为 no)构建pyexpat模块。
- --with-system-ffi
- 使用已安装的
ffi库构建_ctypes扩展模块,请参阅 ctypes 模块(默认与系统相关)。
- --with-system-libmpdec
使用已安装的
mpdec库构建_decimal扩展模块,请参阅 decimal 模块(默认为 no)。3.3 版中的新功能。
- --with-readline=editline
使用
editline库作为 readline 模块的后端。定义
WITH_EDITLINE宏。3.10 版中的新功能。
- --without-readline
不要构建 readline 模块(默认构建)。
不要定义
HAVE_LIBREADLINE宏。3.10 版中的新功能。
- --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:从自动检测rpath--with-openssl和pkg-config;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(带抖动);blake2。
3.9 版中的新功能。
- --with-ssl-default-suites=[python|openssl|STRING]
覆盖 OpenSSL 默认密码套件字符串:
python(默认):使用Python的首选;openssl:保持 OpenSSL 的默认值不变;STRING:使用自定义字符串
请参阅 ssl 模块。
3.7 版中的新功能。
3.10 版更改: 设置
python和 STRING 也将 TLS 1.2 设置为最低协议版本。
3.1.9. macOS 选项
参见 Mac/README.rst。
- --enable-universalsdk
- --enable-universalsdk=SDKDIR
- 创建通用二进制构建。 SDKDIR 指定应该使用哪个 macOS SDK 来执行构建(默认为 no)。
- --enable-framework
- --enable-framework=INSTALLDIR
- 创建一个 Python.framework 而不是传统的 Unix 安装。 可选 INSTALLDIR 指定安装路径(默认为 no)。
- --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。 您可以使用配置 --enable-optimizations 选项使其成为make命令(make all或仅make)的默认目标。make buildbottest:构建 Python 并运行 Python 测试套件,与构建机器人测试 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 扩展构建为共享库。
Include/pyport.h 的 PyAPI_FUNC()、PyAPI_API() 和 PyMODINIT_FUNC() 宏的定义不同,具体取决于是否定义了 Py_BUILD_CORE_MODULE 宏:
- 如果定义了
Py_BUILD_CORE_MODULE,则使用Py_EXPORTED_SYMBOL - 否则使用
Py_IMPORTED_SYMBOL。
如果在作为共享库构建的 C 扩展上错误地使用了 Py_BUILD_CORE_BUILTIN 宏,则不会导出其 PyInit_xxx() 函数,从而导致导入时出现 ImportError。
3.3. 编译器和链接器标志
由 ./configure 脚本和环境变量设置并由 Makefile 使用的选项。
3.3.1. 预处理器标志
- CONFIGURE_CPPFLAGS
CPPFLAGS 变量的值传递给
./configure脚本。3.6 版中的新功能。
- CPPFLAGS
(目标)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,编译器标志应该 not 成为 distutils CFLAGS 的一部分时使用它(:issue:`21121`) .
3.5 版中的新功能。
- EXTRA_CFLAGS
- 额外的 C 编译器标志。
- CONFIGURE_CFLAGS
CFLAGS 变量的值传递给
./configure脚本。3.2 版中的新功能。
- 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 是一个内存调试程序。
默认值:空字符串(未使用)。
3.3.3. 链接器标志
- LINKCC
用于构建
python和_testembed等程序的链接器命令。默认值:
$(PURIFY) $(MAINCC)。
- CONFIGURE_LDFLAGS
LDFLAGS 变量的值传递给
./configure脚本。避免分配 CFLAGS、LDFLAGS 等。 因此用户可以在命令行上使用它们来附加到这些值,而无需踩踏预设值。
3.2 版中的新功能。
- LDFLAGS_NODIST
- LDFLAGS_NODIST 的使用方式与 CFLAGS_NODIST 相同。 一旦安装了 Python,当链接器标志应该 not 成为 distutils LDFLAGS 的一部分时使用它(:issue:`35257`) .
- CONFIGURE_LDFLAGS_NODIST
LDFLAGS_NODIST 变量的值传递给
./configure脚本。3.8 版中的新功能。
- LDFLAGS
链接器标志,例如
-L<lib dir>如果您在非标准目录<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 版中的新功能。