python-build-standalone: 打造高可攜性的 Python 發行版

python-build-standalone: 打造高可攜性的 Python 發行版

概述

python-build-standalone 產出自我包含且具備高可攜性的 Python 發行版,其中包含功能完整的 Python 安裝。透過確保標準函式庫中的大多數擴充模組皆已包含在內,並將函式庫依賴項進行靜態連結或打包,該專案將執行時依賴項降至最低,以確保發行版能在目標架構的任何系統上運作。

核心技術方法

為了實現高可攜性,python-build-standalone 採用了幾種特定的構建策略:

  • 最小化執行時依賴項: 構建過程限制了執行時所需的共享函式庫集合。
  • CPU 指令集限制: 專案限制了所使用的 CPU 指令集,以確保在相同架構下能與更廣泛的硬體相容。
  • 靈活的重新打包: 某些發行版包含構建產物(物件檔與函式庫)以及豐富的元數據(metadata)。這使得下游的重新打包者可以建立自定義發行版,例如移除 SQLite 或 OpenSSL 以縮減嵌入到大型應用程式中的二進位檔案大小。

生態系統整合與維護

該專案最初由 indygreg 開發,現在由 Astral(以及延伸出的 OpenAI)維護。它是數個知名 Python 工具的基礎設施:

  • uv: 由 Astral 開發的 Python 套件與專案管理工具,使用這些發行版為使用者安裝 Python 版本。
  • 其他工具:pipxHatchPoetryBazel 等工具也利用這些發行版來提供自動化 Python 安裝。

根據 Astral 的 Charlie Marsh 所說,目前的工程重點集中在三個主要領域:跟上上游 CPython 的步伐、解決與 CPython 相關的已知「怪癖」(quirks),以及優化這些發行版的效能,使其達到或超越其他的 CPython 構建版本。

相關專案與替代方案

PyOxidizer 與 PyOxy

對於需要單一檔案執行檔的使用者,姊妹專案 PyOxy(以及更廣泛的 PyOxidizer 專案)利用了 python-build-standalone 的發行版。PyOxy 加入了 Rust 程式碼以增強解釋器的功能,讓開發者可以:

  • 產出代表 Python 應用程式的單一檔案執行檔。
  • 將自我包含的 Python 解釋器作為函式庫嵌入到較大的應用程式中。
  • 建立 Rust 與 Python 之間的橋樑,實現將 Rust 加入 Python 或反之亦然。

Cosmopolitan

對於極端跨平台需求的替代方案是 APE/Cosmopolitan 專案,它提供單一二進位檔案(Python 約為 40MB),即可在 Linux、macOS、Windows、FreeBSD、OpenBSD 和 NetBSD 上原生執行。

實作考量與限制

雖然這些發行版是「自我包含」的,但它們並非完全獨立於主機環境。技術限制包括:

  • 系統邊界: 發行版在 glibc 版本和 CPU 特性層級方面仍面臨邊界限制。
  • 原生擴充功能: 雖然 musl 構建版本移除了 libc 依賴,但它們無法載入標準的 .so 擴充功能。
  • 行為怪癖: 使用者可能會遇到特定的怪癖,例如 Windows 上缺少 pip.exe、Linux 上使用 libedit,或 Python REPL 中的特殊按鍵問題。

「virtualenv 仍然依賴於主機解釋器和作業系統。這些發行版固定了解釋器、標準函式庫和大多數執行時依賴項,但剩餘的邊界正是生產環境出現意外的地方:glibc 版本、CPU 特性層級以及第三方原生擴充功能。」

發行版類型摘要

壓縮檔類型 內容 主要使用場景
Full Archive 完整的構建產物與元數據 下游重新打包與自定義嵌入
Install-Only Archive 準備就緒的 Python 安裝 直接執行與基於工具的安裝(例如透過 uv

Sources