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
- 将
libc
C 库覆盖为 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/makesetup
shell 脚本构建的 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 版中的新功能。