3. 配置 Python

3.1. 構建要求

構建 CPython 所需的特性和最低版本

構建可選模組

有關構建所有模組所需的依賴項的完整列表以及如何安裝它們,請參閱 devguide

  • 重新生成 configure 指令碼需要 Autoconf 2.72 和 aclocal 1.16.5。

3.1 版中已更改: 現在需要 Tcl/Tk 8.3.1 版本。

3.5 版中已更改: 在 Windows 上,現在需要 Visual Studio 2015 或更高版本。現在需要 Tcl/Tk 8.4 版本。

3.6 版中已更改: 現在需要選定的 C99 特性,例如 <stdint.h>static inline 函式。

3.7 版中已更改: 現在需要執行緒支援和 OpenSSL 1.0.2。

3.10 版中已更改: 現在需要 OpenSSL 1.1.1。需要 SQLite 3.7.15。

3.11 版中已更改: 現在需要 C11 編譯器、IEEE 754 和 NaN 支援。在 Windows 上,需要 Visual Studio 2017 或更高版本。對於 tkinter 模組,現在需要 Tcl/Tk 8.5.12 版本。

3.13 版中已更改: 現在需要 Autoconf 2.71、aclocal 1.16.5 和 SQLite 3.15.2。

3.14 版中已更改: 現在需要 Autoconf 2.72。

另請參閱 PEP 7 “C 程式碼風格指南”和 PEP 11 “CPython 平臺支援”。

3.2. 生成的檔案

為了減少構建依賴項,Python 原始碼包含多個生成的檔案。重新生成所有生成檔案的命令

make regen-all
make regen-stdlib-module-names
make regen-limited-abi
make regen-configure

Makefile.pre.in 檔案記錄了生成的檔案、它們的輸入以及用於重新生成它們的工具。搜尋 regen-* make 目標。

3.2.1. 配置指令碼

make regen-configure 命令使用 Tools/build/regen-configure.sh shell 指令碼重新生成 aclocal.m4 檔案和 configure 指令碼,該指令碼使用 Ubuntu 容器獲取相同的工具版本並生成可重現的輸出。

容器是可選的,以下命令可以在本地執行

autoreconf -ivf -Werror

生成的檔案可能會根據具體的 autoconf-archiveaclocalpkg-config 版本而變化。

3.3. 配置選項

使用以下命令列出所有 configure 指令碼選項

./configure --help

另請參閱 Python 原始碼分發中的 Misc/SpecialBuilds.txt

3.3.1. 通用選項

--enable-loadable-sqlite-extensions

支援 sqlite3 模組的 _sqlite 擴充套件模組中的可載入擴充套件(預設為否)。

請參閱 sqlite3 模組的 sqlite3.Connection.enable_load_extension() 方法。

在 3.6 版本加入。

--disable-ipv6

停用 IPv6 支援(如果支援,預設啟用),請參閱 socket 模組。

--enable-big-digits=[15|30]

定義 Python int 數字的位大小:15 或 30 位。

預設情況下,數字大小為 30。

PYLONG_BITS_IN_DIGIT 定義為 1530

請參閱 sys.int_info.bits_per_digit

--with-suffix=SUFFIX

將 Python 可執行檔案字尾設定為 *SUFFIX*。

在 Windows 和 macOS 上(python.exe 可執行檔案),預設字尾為 .exe;在 Emscripten 節點上為 .js;在 Emscripten 瀏覽器上為 .html;在 WASI 上為 .wasm;在其他平臺上為空字串(python 可執行檔案)。

3.11 版中已更改: WASM 平臺上的預設字尾是 .js.html.wasm 之一。

--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=<list of backend names>

覆蓋 dbm 模組檢查 db 後端的順序

有效值是後端名稱以冒號 (:) 分隔的字串

  • 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 模組使用的 wheel 包的目錄(預設無)。

一些 Linux 發行版打包策略建議不要捆綁依賴項。例如,Fedora 將 wheel 包安裝在 /usr/share/python-wheels/ 目錄中,並且不安裝 ensurepip._bundled 包。

在 3.10 版本加入。

--with-pkg-config=[check|yes|no]

configure 是否應該使用 pkg-config 來檢測構建依賴項。

  • check(預設):pkg-config 是可選的

  • yespkg-config 是強制性的

  • no:即使存在 pkg-config,configure 也不使用它

在 3.11 版本中新增。

--enable-pystats

開啟內部 Python 效能統計資訊收集。

預設情況下,統計資訊收集是關閉的。使用 python3 -X pystats 命令或設定 PYTHONSTATS=1 環境變數以在 Python 啟動時開啟統計資訊收集。

在 Python 退出時,如果統計資訊收集已開啟且未清除,則轉儲統計資訊。

影響

  • 新增 -X pystats 命令列選項。

  • 新增 PYTHONSTATS 環境變數。

  • 定義 Py_STATS 宏。

  • sys 模組新增函式

    • sys._stats_on():開啟統計資訊收集。

    • sys._stats_off():關閉統計資訊收集。

    • sys._stats_clear():清除統計資訊。

    • sys._stats_dump():將統計資訊轉儲到檔案,並清除統計資訊。

統計資訊將被轉儲到 /tmp/py_stats/ (Unix) 或 C:\temp\py_stats\ (Windows) 中的任意(可能唯一)檔案。如果該目錄不存在,結果將列印到 stderr。

使用 Tools/scripts/summarize_stats.py 讀取統計資訊。

統計資料

  • 操作碼

    • 專門化:成功、失敗、命中、延遲、未命中、去最佳化、失敗;

    • 執行計數;

    • 對數。

  • 呼叫

    • 內聯 Python 呼叫;

    • PyEval 呼叫;

    • 壓入幀;

    • 建立幀物件;

    • Eval 呼叫:向量、生成器、遺留、函式 VECTORCALL、構建類、槽、函式“ex”、API、方法。

  • 物件

    • 增引用和減引用;

    • 直譯器增引用和減引用;

    • 分配:所有、512 位元組、4 KiB、大;

    • 釋放;

    • 到/從空閒列表;

    • 字典實體化/非實體化;

    • 型別快取;

    • 最佳化嘗試;

    • 建立/執行最佳化跟蹤;

    • 執行的 uops。

  • 垃圾回收器

    • 垃圾回收;

    • 訪問的物件;

    • 收集的物件。

在 3.11 版本中新增。

--disable-gil

啟用在沒有 全域性直譯器鎖 (GIL) 的情況下執行 Python 的支援:自由執行緒構建。

定義 Py_GIL_DISABLED 宏並向 sys.abiflags 新增 "t"

有關更多詳細資訊,請參閱 自由執行緒 CPython

在 3.13 版本加入。

--enable-experimental-jit=[no|yes|yes-off|interpreter]

指示如何整合 實驗性即時編譯器

  • no:不構建 JIT。

  • yes:啟用 JIT。要在執行時停用它,請設定環境變數 PYTHON_JIT=0

  • yes-off:構建 JIT,但預設停用。要在執行時啟用它,請設定環境變數 PYTHON_JIT=1

  • interpreter:啟用“JIT 直譯器”(僅對除錯 JIT 本身的人有用)。要在執行時停用它,請設定環境變數 PYTHON_JIT=0

如果未提供該選項,則 --enable-experimental-jit=no 是預設行為,而 --enable-experimental-jit--enable-experimental-jit=yes 的簡寫。有關更多資訊,包括如何安裝必要的構建時依賴項,請參閱 Tools/jit/README.md

備註

當啟用 JIT 構建 CPython 時,請確保您的系統已安裝 Python 3.11 或更高版本。

在 3.13 版本加入。

PKG_CONFIG

pkg-config 工具的路徑。

PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH

pkg-config 選項。

3.3.2. C 編譯器選項

CC

C 編譯器命令。

CFLAGS

C 編譯器標誌。

CPP

C 預處理器命令。

CPPFLAGS

C 預處理器標誌,例如 -Iinclude_dir

3.3.3. 連結器選項

LDFLAGS

連結器標誌,例如 -Llibrary_directory

LIBS

傳遞給連結器的庫,例如 -llibrary

MACHDEP

機器相關庫檔案的名稱。

3.3.4. 第三方依賴項選項

在 3.11 版本中新增。

BZIP2_CFLAGS
BZIP2_LIBS

用於將 Python 連結到 libbz2 的 C 編譯器和連結器標誌,由 bz2 模組使用,覆蓋 pkg-config

CURSES_CFLAGS
CURSES_LIBS

用於 libncurseslibncursesw 的 C 編譯器和連結器標誌,由 curses 模組使用,覆蓋 pkg-config

GDBM_CFLAGS
GDBM_LIBS

用於 gdbm 的 C 編譯器和連結器標誌。

LIBB2_CFLAGS
LIBB2_LIBS

用於 libb2 (BLAKE2) 的 C 編譯器和連結器標誌,由 hashlib 模組使用,覆蓋 pkg-config

LIBEDIT_CFLAGS
LIBEDIT_LIBS

用於 libedit 的 C 編譯器和連結器標誌,由 readline 模組使用,覆蓋 pkg-config

LIBFFI_CFLAGS
LIBFFI_LIBS

用於 libffi 的 C 編譯器和連結器標誌,由 ctypes 模組使用,覆蓋 pkg-config

LIBMPDEC_CFLAGS
LIBMPDEC_LIBS

用於 libmpdec 的 C 編譯器和連結器標誌,由 decimal 模組使用,覆蓋 pkg-config

備註

除非指定了 --with-system-libmpdec,否則這些環境變數無效。

LIBLZMA_CFLAGS
LIBLZMA_LIBS

用於 liblzma 的 C 編譯器和連結器標誌,由 lzma 模組使用,覆蓋 pkg-config

LIBREADLINE_CFLAGS
LIBREADLINE_LIBS

用於 libreadline 的 C 編譯器和連結器標誌,由 readline 模組使用,覆蓋 pkg-config

LIBSQLITE3_CFLAGS
LIBSQLITE3_LIBS

用於 libsqlite3 的 C 編譯器和連結器標誌,由 sqlite3 模組使用,覆蓋 pkg-config

LIBUUID_CFLAGS
LIBUUID_LIBS

用於 libuuid 的 C 編譯器和連結器標誌,由 uuid 模組使用,覆蓋 pkg-config

LIBZSTD_CFLAGS
LIBZSTD_LIBS

用於 libzstd 的 C 編譯器和連結器標誌,由 compression.zstd 模組使用,覆蓋 pkg-config

在 3.14 版本加入。

PANEL_CFLAGS
PANEL_LIBS

PANEL 的 C 編譯器和連結器標誌,覆蓋 pkg-config

用於 libpanellibpanelw 的 C 編譯器和連結器標誌,由 curses.panel 模組使用,覆蓋 pkg-config

TCLTK_CFLAGS
TCLTK_LIBS

TCLTK 的 C 編譯器和連結器標誌,覆蓋 pkg-config

ZLIB_CFLAGS
ZLIB_LIBS

用於 libzlib 的 C 編譯器和連結器標誌,由 gzip 模組使用,覆蓋 pkg-config

3.3.5. WebAssembly 選項

--enable-wasm-dynamic-linking

為 WASM 開啟動態連結支援。

動態連結啟用 dlopen。由於有限的死程式碼消除和附加功能,可執行檔案的大小增加。

在 3.11 版本中新增。

--enable-wasm-pthreads

為 WASM 開啟 pthreads 支援。

在 3.11 版本中新增。

3.3.6. 安裝選項

--prefix=PREFIX

將與體系結構無關的檔案安裝在 PREFIX 中。在 Unix 上,它預設為 /usr/local

此值可以在執行時使用 sys.prefix 檢索。

例如,可以使用 --prefix="$HOME/.local/" 將 Python 安裝到其主目錄中。

--exec-prefix=EPREFIX

將與體系結構相關的檔案安裝在 EPREFIX 中,預設為 --prefix

此值可以在執行時使用 sys.exec_prefix 檢索。

--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.3.7. 效能選項

建議使用 --enable-optimizations --with-lto(PGO + LTO)配置 Python 以獲得最佳效能。實驗性的 --enable-bolt 標誌也可用於提高效能。

--enable-optimizations

使用 PROFILE_TASK 啟用配置檔案引導最佳化 (PGO)(預設停用)。

C 編譯器 Clang 需要 llvm-profdata 程式進行 PGO。在 macOS 上,GCC 也需要它:GCC 在 macOS 上只是 Clang 的別名。

如果使用 --enable-shared 且使用 GCC,也停用 libpython 中的語義插入:將 -fno-semantic-interposition 新增到編譯器和連結器標誌中。

備註

在構建過程中,您可能會遇到關於某些原始檔沒有可用配置檔案資料的編譯器警告。這些警告是無害的,因為在配置檔案資料獲取期間只執行了程式碼的一個子集。要在 Clang 上停用這些警告,請手動新增 -Wno-profile-instr-unprofiledCFLAGS 來抑制它們。

在 3.6 版本加入。

3.10 版中已更改: 在 GCC 上使用 -fno-semantic-interposition

PROFILE_TASK

Makefile 中使用的環境變數:用於 PGO 生成任務的 Python 命令列引數。

預設值:-m test --pgo --timeout=$(TESTTIMEOUT)

在 3.8 版本加入。

3.13 版中已更改: 任務失敗不再靜默忽略。

--with-lto=[full|thin|no|yes]

在任何構建中啟用連結時間最佳化 (LTO)(預設停用)。

C 編譯器 Clang 需要 llvm-ar 進行 LTO(macOS 上為 ar),以及支援 LTO 的連結器(ld.goldlld)。

在 3.6 版本加入。

3.11 新版功能: 要使用 ThinLTO 功能,請在 Clang 上使用 --with-lto=thin

3.12 版中已更改: 如果編譯器接受該標誌,則在 Clang 上使用 ThinLTO 作為預設最佳化策略。

--enable-bolt

啟用使用 BOLT 後連結二進位制最佳化器(預設停用)。

BOLT 是 LLVM 專案的一部分,但並非總是包含在它們的二進位制發行版中。此標誌要求 llvm-boltmerge-fdata 可用。

BOLT 仍然是一個相當新的專案,因此此標誌目前應被視為實驗性。由於此工具在機器程式碼上執行,其成功取決於構建環境 + 其他最佳化配置引數 + CPU 架構的組合,並非所有組合都受支援。LLVM 16 之前的 BOLT 版本已知在某些情況下會導致 BOLT 崩潰。強烈建議使用 LLVM 16 或更新版本進行 BOLT 最佳化。

可以定義 BOLT_INSTRUMENT_FLAGSBOLT_APPLY_FLAGS configure 變數,以分別覆蓋 llvm-bolt 用於檢測二進位制檔案和將 BOLT 資料應用於二進位制檔案的預設引數集。

3.12 新版功能.

BOLT_APPLY_FLAGS

建立 BOLT 最佳化二進位制檔案時傳遞給 llvm-bolt 的引數。

3.12 新版功能.

BOLT_INSTRUMENT_FLAGS

檢測二進位制檔案時傳遞給 llvm-bolt 的引數。

3.12 新版功能.

--with-computed-gotos

在評估迴圈中啟用計算 goto(在支援的編譯器上預設啟用)。

--with-tail-call-interp

啟用在 CPython 中使用尾呼叫(tail calls)的直譯器。如果啟用,強烈建議啟用 PGO(--enable-optimizations)。此選項特別需要支援適當尾呼叫的 C 編譯器和 preserve_none 呼叫約定。例如,Clang 19 及更高版本支援此功能。

在 3.14 版本加入。

--without-mimalloc

停用快速 mimalloc 分配器(預設啟用)。

另請參閱 PYTHONMALLOC 環境變數。

--without-pymalloc

停用專用 Python 記憶體分配器 pymalloc(預設啟用)。

另請參閱 PYTHONMALLOC 環境變數。

--without-doc-strings

停用靜態文件字串以減少記憶體佔用(預設啟用)。Python 中定義的文件字串不受影響。

不定義 WITH_DOC_STRINGS 宏。

請參閱 PyDoc_STRVAR() 宏。

--enable-profiling

使用 gprof 啟用 C 級程式碼分析(預設停用)。

--with-strict-overflow

-fstrict-overflow 新增到 C 編譯器標誌(預設我們新增 -fno-strict-overflow)。

--without-remote-debug

停用 PEP 768 中描述的遠端除錯支援(預設啟用)。當提供此標誌時,允許直譯器在單獨程序中排程 Python 檔案執行的程式碼(如 PEP 768 中所述)不會被編譯。這包括排程要執行的程式碼的功能和接收要執行的程式碼的功能。

Py_REMOTE_DEBUG

除非 Python 配置了 --without-remote-debug,否則此宏預設定義。

請注意,即使定義了宏,遠端除錯也可能不可用(例如,在不相容的平臺上)。

在 3.14 版本加入。

3.3.8. Python 除錯構建

除錯構建是使用 --with-pydebug 配置選項構建的 Python。

除錯構建的影響

  • 預設顯示所有警告:warnings 模組中預設警告過濾器列表為空。

  • sys.abiflags 新增 d

  • 新增 sys.gettotalrefcount() 函式。

  • 新增 -X showrefcount 命令列選項。

  • 新增 -d 命令列選項和 PYTHONDEBUG 環境變數以除錯解析器。

  • 新增對 __lltrace__ 變數的支援:如果定義了該變數,則在位元組碼評估迴圈中啟用低階跟蹤。

  • 在記憶體分配器上安裝 除錯鉤子 以檢測緩衝區溢位和其他記憶體錯誤。

  • 定義 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 選項)。

3.3.9. 除錯選項

--with-pydebug

在除錯模式下構建 Python:定義 Py_DEBUG 宏(預設停用)。

--with-trace-refs

啟用跟蹤引用以用於除錯目的(預設停用)。

影響

PYTHONDUMPREFS 環境變數可用於在 Python 退出時轉儲仍然存活的物件和引用計數。

靜態分配的物件 不會被跟蹤。

在 3.8 版本加入。

3.13 版中已更改: 此構建現在與釋出構建和 除錯構建 ABI 相容。

--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(預設停用)。為了提高 ASan 檢測能力,您可能還需要將其與 --without-pymalloc 結合使用,以停用專門的小物件分配器,其分配不被 ASan 跟蹤。

在 3.6 版本加入。

--with-memory-sanitizer

啟用 MemorySanitizer 分配錯誤檢測器 msan(預設停用)。

在 3.6 版本加入。

--with-undefined-behavior-sanitizer

啟用 UndefinedBehaviorSanitizer 未定義行為檢測器 ubsan(預設停用)。

在 3.6 版本加入。

--with-thread-sanitizer

啟用 ThreadSanitizer 資料競爭檢測器 tsan(預設停用)。

在 3.13 版本加入。

3.3.10. 連結器選項

--enable-shared

啟用構建共享 Python 庫:libpython(預設停用)。

--without-static-libpython

不構建 libpythonMAJOR.MINOR.a 並且不安裝 python.o(預設構建和啟用)。

在 3.10 版本加入。

3.3.11. 庫選項

--with-libs='lib1 ...'

連結到附加庫(預設停用)。

--with-system-expat

使用已安裝的 expat 庫構建 pyexpat 模組(預設停用)。

--with-system-libmpdec

使用已安裝的 mpdecimal 庫構建 _decimal 擴充套件模組,請參閱 decimal 模組(預設啟用)。

在 3.3 版本加入。

3.13 版中已更改: 預設使用已安裝的 mpdecimal 庫。

自 3.13 版起已廢棄,並將在 3.16 版中移除: mpdecimal 庫的副本將不再隨 Python 3.16 一起分發。

--with-readline=readline|editline

readline 模組指定後端庫。

  • readline:使用 readline 作為後端。

  • editline:使用 editline 作為後端。

在 3.10 版本加入。

--without-readline

不構建 readline 模組(預設構建)。

不定義 HAVE_LIBREADLINE 宏。

在 3.10 版本加入。

--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:從 --with-opensslpkg-config 自動檢測 rpath;

  • DIR:設定顯式 rpath。

在 3.10 版本加入。

3.3.12. 安全選項

--with-hash-algorithm=[fnv|siphash13|siphash24]

選擇用於 Python/pyhash.c 中的雜湊演算法

  • siphash13(預設);

  • siphash24;

  • fnv.

在 3.4 版本加入。

3.11 新版功能: 添加了 siphash13,它是新的預設值。

--with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2

內建雜湊模組

  • md5;

  • sha1;

  • sha256;

  • sha512;

  • sha3 (帶 shake);

  • 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 設定為最低協議版本。

--disable-safety

停用 OpenSSF 為安全原因推薦的、沒有效能開銷的編譯器選項。如果未啟用此選項,CPython 將基於沒有速度下降的安全編譯器選項進行構建。啟用此選項時,CPython 將不會使用下面列出的編譯器選項進行構建。

以下編譯器選項在使用 --disable-safety 時被停用

在 3.14 版本加入。

--enable-slower-safety

啟用 OpenSSF 為安全原因推薦的、需要額外開銷的編譯器選項。如果未啟用此選項,CPython 將不會基於對效能有影響的安全編譯器選項進行構建。啟用此選項時,CPython 將使用下面列出的編譯器選項進行構建。

以下編譯器選項在使用 --enable-slower-safety 時被啟用

  • -D_FORTIFY_SOURCE=3: 使用編譯時和執行時檢查來加固不安全的 libc 用法和緩衝區溢位。

在 3.14 版本加入。

3.3.13. 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 (x86-64 和 arm64);

  • 32-bit (PPC 和 i386);

  • 64-bit (PPC64 和 x86-64);

  • 3-way (i386, PPC 和 x86-64);

  • intel (i386 和 x86-64);

  • intel-32 (i386);

  • intel-64 (x86-64);

  • all (PPC, i386, PPC64 和 x86-64)。

請注意,此配置項的值與 macOS 上通用二進位制輪子使用的識別符號 相同。有關 macOS 上使用的打包平臺相容性標籤 的詳細資訊,請參見 Python 打包使用者指南。

--with-framework-name=FRAMEWORK

指定 macOS 上 Python framework 的名稱,僅在設定 --enable-framework 時有效(預設值:Python)。

--with-app-store-compliance
--with-app-store-compliance=PATCH-FILE

Python 標準庫包含的字串在提交到 macOS 和 iOS App Store 進行分發時已知會觸發自動化檢查工具錯誤。如果啟用此選項,將應用已知能糾正 App Store 合規性的補丁列表。也可以指定自定義補丁檔案。此選項預設停用。

在 3.13 版本加入。

3.3.14. iOS 選項

參見 iOS/README.rst

--enable-framework=INSTALLDIR

建立 Python.framework。與 macOS 不同,指定安裝路徑的 INSTALLDIR 引數是強制性的。

--with-framework-name=FRAMEWORK

指定 framework 的名稱(預設值:Python)。

3.3.15. 交叉編譯選項

交叉編譯,也稱為交叉構建,可用於為其他 CPU 架構或平臺構建 Python。交叉編譯需要用於構建平臺的 Python 直譯器。構建 Python 的版本必須與交叉編譯的主機 Python 的版本匹配。

--build=BUILD

為 BUILD 上的構建進行配置,通常由 config.guess 推斷。

--host=HOST

交叉編譯以構建在 HOST(目標平臺)上執行的程式

--with-build-python=path/to/python

用於交叉編譯的構建 python 二進位制檔案的路徑

在 3.11 版本中新增。

CONFIG_SITE=file

指向包含配置覆蓋的檔名的環境變數。

示例 config.site 檔案

# config.site-aarch64
ac_cv_buggy_getaddrinfo=no
ac_cv_file__dev_ptmx=yes
ac_cv_file__dev_ptc=no
HOSTRUNNER

用於交叉編譯的主機平臺執行 CPython 的程式。

在 3.11 版本中新增。

交叉編譯示例

CONFIG_SITE=config.site-aarch64 ../configure \
    --build=x86_64-pc-linux-gnu \
    --host=aarch64-unknown-linux-gnu \
    --with-build-python=../x86_64/python

3.4. Python 構建系統

3.4.1. 構建系統主要檔案

  • configure.ac => configure;

  • Makefile.pre.in => Makefile (由 configure 建立);

  • pyconfig.h (由 configure 建立);

  • Modules/Setup: 透過 Makefile 使用 Module/makesetup shell 指令碼構建的 C 擴充套件;

3.4.2. 主要構建步驟

  • C 檔案 (.c) 被構建為物件檔案 (.o)。

  • 從物件檔案建立靜態 libpython 庫 (.a)。

  • python.o 和靜態 libpython 庫被連結到最終的 python 程式中。

  • C 擴充套件由 Makefile 構建(參見 Modules/Setup)。

3.4.3. 主要 Makefile 目標

3.4.3.1. make

在編輯一些程式碼或從上游重新整理檢出後重新構建時,大多數情況下,您只需要執行 make,它(根據 Make 的語義)會構建預設目標,即 Makefile 中定義的第一個目標。按照傳統(包括在 CPython 專案中),這通常是 all 目標。configure 指令碼擴充套件了一個 autoconf 變數 @DEF_MAKE_ALL_RULE@,以精確描述 make all 將構建哪些目標。有三種選擇:

  • profile-opt(使用 --enable-optimizations 配置)

  • build_wasm(如果主機平臺匹配 wasm32-wasi*wasm32-emscripten 則選擇)

  • build_all(未明確使用其他任何選項進行配置)

根據最近的原始檔更改,Make 將重新構建任何被視為過時的目標(物件檔案和可執行檔案),必要時還會再次執行 configure。然而,源/目標依賴項眾多且是手動維護的,因此 Make 有時無法獲得正確檢測所有需要重新構建的目標所需的所有資訊。根據未重新構建的目標,您可能會遇到一些問題。如果您遇到無法解釋的構建或測試問題,make clean && make 應該可以解決大多數依賴項問題,但會增加構建時間。

3.4.3.2. make platform

構建 python 程式,但不構建標準庫擴充套件模組。這將生成一個名為 platform 的檔案,其中包含一行描述構建平臺詳細資訊的內容,例如 macosx-14.3-arm64-3.12linux-x86_64-3.13

3.4.3.3. make profile-opt

使用配置檔案引導最佳化 (PGO) 構建 Python。您可以使用配置選項 --enable-optimizations 使其成為 make 命令(make all 或僅僅 make)的預設目標。

3.4.3.4. make clean

移除已構建檔案。

3.4.3.5. make distclean

除了 make clean 完成的工作外,還移除由 configure 指令碼建立的檔案。configure 必須在再次構建之前執行。[1]

3.4.3.6. make install

構建 all 目標並安裝 Python。

3.4.3.7. make test

構建 all 目標並使用 --fast-ci 選項執行 Python 測試套件,不包括 GUI 測試。變數:

  • TESTOPTS: 額外的 regrtest 命令列選項。

  • TESTPYTHONOPTS: 額外的 Python 命令列選項。

  • TESTTIMEOUT: 超時時間(秒)(預設:10 分鐘)。

3.4.3.8. make ci

這類似於 make test,但使用 -ugui 也執行 GUI 測試。

在 3.14 版本加入。

3.4.3.9. make buildbottest

這類似於 make test,但使用 --slow-ci 選項和預設 20 分鐘的超時時間,而不是 --fast-ci 選項。

3.4.3.10. make regen-all

重新生成(幾乎)所有生成的檔案。其中包括(但不限於)位元組碼用例和解析器生成器檔案。make regen-stdlib-module-namesautoconf 必須為剩餘的生成檔案單獨執行。

3.4.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* 標記之後定義的擴充套件作為動態庫構建。

Include/exports.h 中的 PyAPI_FUNC()PyAPI_DATA()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.5. 編譯器和連結器標誌

./configure 指令碼和環境變數設定並由 Makefile 使用的選項。

3.5.1. 預處理器標誌

CONFIGURE_CPPFLAGS

傳遞給 ./configure 指令碼的 CPPFLAGS 變數的值。

在 3.6 版本加入。

CPPFLAGS

(Objective) C/C++ 預處理器標誌,例如,如果您在非標準目錄 include_dir 中有標頭檔案,則為 -Iinclude_dir

CPPFLAGSLDFLAGS 都需要包含 shell 的值,以便能夠使用環境變數中指定的目錄構建擴充套件模組。

BASECPPFLAGS

在 3.4 版本加入。

PY_CPPFLAGS

為構建直譯器物件檔案而新增的額外預處理器標誌。

預設值:$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)

在 3.2 版本加入。

3.5.2. 編譯器標誌

CC

C 編譯器命令。

示例:gcc -pthread

CXX

C++ 編譯器命令。

示例:g++ -pthread

CFLAGS

C 編譯器標誌。

CFLAGS_NODIST

CFLAGS_NODIST 用於構建直譯器和標準庫 C 擴充套件。當編譯器標誌在 Python 安裝後 不應 成為 CFLAGS 的一部分時使用(gh-65320)。

特別是,CFLAGS 不應包含:

  • 編譯器標誌 -I(用於設定包含檔案的搜尋路徑)。-I 標誌從左到右處理,CFLAGS 中的任何標誌都將優先於使用者和包提供的 -I 標誌。

  • 強化標誌,例如 -Werror,因為發行版無法控制使用者安裝的包是否符合此類更高的標準。

在 3.5 版本加入。

COMPILEALL_OPTS

make install 中構建 PYC 檔案時傳遞給 compileall 命令列的選項。預設值:-j0

3.12 新版功能.

EXTRA_CFLAGS

額外的 C 編譯器標誌。

CONFIGURE_CFLAGS

傳遞給 ./configure 指令碼的 CFLAGS 變數的值。

在 3.2 版本加入。

CONFIGURE_CFLAGS_NODIST

傳遞給 ./configure 指令碼的 CFLAGS_NODIST 變數的值。

在 3.5 版本加入。

BASECFLAGS

基本編譯器標誌。

OPT

最佳化標誌。

CFLAGS_ALIASING

用於編譯 Python/dtoa.c 的嚴格或非嚴格別名標誌。

在 3.7 版本加入。

CCSHARED

用於構建共享庫的編譯器標誌。

例如,在 Linux 和 BSD 上使用 -fPIC

CFLAGSFORSHARED

為構建直譯器物件檔案而新增的額外 C 標誌。

預設值:當使用 --enable-shared 時為 $(CCSHARED),否則為空字串。

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 標誌,例如 posix 模組。

預設值:$(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.5.3. 連結器標誌

LINKCC

用於構建 python_testembed 等程式的連結器命令。

預設值:$(PURIFY) $(CC)

CONFIGURE_LDFLAGS

傳遞給 ./configure 指令碼的 LDFLAGS 變數的值。

避免賦值 CFLAGS, LDFLAGS 等,這樣使用者可以在命令列上使用它們來追加這些值而不會覆蓋預設值。

在 3.2 版本加入。

LDFLAGS_NODIST

LDFLAGS_NODIST 的用法與 CFLAGS_NODIST 相同。當連結器標誌在 Python 安裝後 不應 成為 LDFLAGS 的一部分時使用(gh-65320)。

特別是,LDFLAGS 不應包含:

  • 編譯器標誌 -L(用於設定庫的搜尋路徑)。-L 標誌從左到右處理,LDFLAGS 中的任何標誌都將優先於使用者和包提供的 -L 標誌。

CONFIGURE_LDFLAGS_NODIST

傳遞給 ./configure 指令碼的 LDFLAGS_NODIST 變數的值。

在 3.8 版本加入。

LDFLAGS

連結器標誌,例如,如果您在非標準目錄 lib_dir 中有庫,則為 -Llib_dir

CPPFLAGSLDFLAGS 都需要包含 shell 的值,以便能夠使用環境變數中指定的目錄構建擴充套件模組。

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 版本加入。

腳註