3. 配置 Python

3.1. 構建要求

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

  • C11 編譯器。不需要可選的 C11 特性

  • 在 Windows 上,需要 Microsoft Visual Studio 2017 或更高版本。

  • 支援 IEEE 754 浮點數和 浮點數非數字 (NaN)

  • 支援執行緒。

  • OpenSSL 1.1.1 是 sslhashlib 擴充套件模組的最低版本,建議最低版本為 OpenSSL 3.0.9。

  • sqlite3 擴充套件模組需要 SQLite 3.15.2。

  • tkinter 模組需要 Tcl/Tk 8.5.12。

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

在 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。

另請參閱 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. configure 指令碼

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.Connection.enable_load_extension() 方法,來自 sqlite3 模組。

在 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 上為 .exepython.exe 可執行檔案),在 Emscripten 節點上為 .js,在 Emscripten 瀏覽器上為 .html,在 WASI 上為 .wasm,在其他平臺上為空字串(python 可執行檔案)。

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

--with-tzpath=<以路徑分隔符分隔的絕對路徑列表>

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=<後端名稱列表>

覆蓋檢查 dbm 模組的資料庫後端順序

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

  • ndbm;

  • gdbm;

  • bdb.

--without-c-locale-coercion

停用 C 語言環境強制轉換為基於 UTF-8 的語言環境(預設啟用)。

不要定義 PY_COERCE_C_LOCALE 宏。

請參閱 PYTHONCOERCECLOCALEPEP 538

--without-freelists

停用除空元組單例之外的所有空閒列表。

在 3.11 版本中新增。

--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]

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

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

  • yespkg-config 是強制性的

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

在 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、方法。

  • 物件

    • incref 和 decref;

    • 直譯器 incref 和 decref;

    • 分配:全部、512 位元組、4 kiB、大;

    • 釋放;

    • 到/從空閒列表;

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

    • 型別快取;

    • 最佳化嘗試;

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

    • 執行的 uops。

  • 垃圾回收器

    • 垃圾回收;

    • 訪問的物件;

    • 收集的物件。

在 3.11 版本中新增。

--disable-gil

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

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

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

在 3.13 版本中新增。

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

指示如何整合 JIT 編譯器

  • no - 構建不帶 JIT 的直譯器。

  • yes - 構建帶有 JIT 的直譯器。

  • yes-off - 構建帶有 JIT 的直譯器,但預設情況下停用它。

  • interpreter - 構建不帶 JIT 的直譯器,但啟用第 2 層直譯器。

按照慣例,--enable-experimental-jit--enable-experimental-jit=yes 的簡寫形式。

在 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

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 選項

--with-emscripten-target=[browser|node]

wasm32-emscripten 設定構建風格。

  • browser(預設):預載入最小的 stdlib,預設使用 MEMFS。

  • node:NODERAWFS 和 pthread 支援。

在 3.11 版本中新增。

--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-unprofiled 新增到 CFLAGS 手動抑制它們。

在 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(在受支援的編譯器上預設啟用)。

--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)。

3.3.8. Python 除錯構建

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

除錯構建的效果

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

  • d 新增到 sys.abiflags

  • 新增 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(...);

如果設定,則 NDEBUG 宏不會在 OPT 編譯器變數中定義。

另請參閱 --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 版本中新增。

--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.15 版本中刪除: mpdecimal 庫的原始碼副本將不再與 Python 3.15 一起分發。

另請參閱

LIBMPDEC_CFLAGSLIBMPDEC_LIBS

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

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;

  • 32 位;

  • 64 位;

  • 三向;

  • intel;

  • intel-32;

  • intel-64;

  • 全部.

--with-framework-name=FRAMEWORK

指定 macOS 上 python 框架的名稱,僅當設定了 --enable-framework 時才有效(預設為 Python)。

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

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

在 3.13 版本中新增。

3.3.14. iOS 選項

請參閱 iOS/README.rst

--enable-framework=INSTALLDIR

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

--with-framework-name=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(使用 --with-emscripten-target 配置)

  • 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。您可以使用 configure --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 測試套件。 變數

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

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

  • TESTTIMEOUT: 超時時間(以秒為單位)(預設值:10 分鐘)。

3.4.3.8. make buildbottest

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

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

PyAPI_FUNC()PyAPI_DATA()PyMODINIT_FUNC Include/exports.h 的宏根據是否定義了 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 用於構建直譯器和 stdlib 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 標誌。

預設值:$(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 變數的值。

避免賦值 CFLAGSLDFLAGS 等,以便使用者可以在命令列上使用它們來附加到這些值,而不會覆蓋預設值。

在版本 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 版本中新增。

腳註