3. 配置 Python — Python 文档

来自菜鸟教程
Python/docs/3.10/using/configure
跳转至:导航、​搜索

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_DIGIT1530

参见 sys.int_info.bits_per_digit

--with-cxx-main
--with-cxx-main=COMPILER
编译 Python main() 函数并将 Python 可执行文件与 C++ 编译器链接:$CXXCOMPILER(如果指定)。
--with-suffix=SUFFIX

将 Python 可执行文件后缀设置为 SUFFIX

Windows 和 macOS 上的默认后缀为 .exepython.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_CONTEXTVARcontextvars 模块。

3.9 版中的新功能。

--with-dbmliborder=db1:db2:...

覆盖命令以检查 dbm 模块的数据库后端

一个有效的值是一个冒号 (:) 分隔的字符串和后端名称:

  • ndbm;

  • gdbm;

  • bdb

--without-c-locale-coercion

禁用 C 语言环境强制转换为基于 UTF-8 的语言环境(默认启用)。

不要定义 PY_COERCE_C_LOCALE 宏。

参见 PYTHONCOERCECLOCALEPEP 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.goldlld)。

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_DEBUGPy_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_DEBUGPy_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):

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 版更改: 设置 pythonSTRING 也将 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-namesautoconf 必须为剩余的生成文件单独运行。
  • 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.hPyAPI_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> 中有标题。

CPPFLAGSLDFLAGS 都需要包含 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 脚本。

避免分配 CFLAGSLDFLAGS 等。 因此用户可以在命令行上使用它们来附加到这些值,而无需踩踏预设值。

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> 中有库。

CPPFLAGSLDFLAGS 都需要包含 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 版中的新功能。