建構可重新發行的二進位檔#

本節的目標讀者是任何想要建構 SciPy 並將其部署到自己機器以外任何地方的人 — 從發行版封裝者到想要建構 Wheel 以部署到其生產環境的使用者

當使用 python -m buildpip wheel 建構 SciPy Wheel 時,該 Wheel 將依賴外部共享程式庫(至少對於 BLAS/LAPACK 和 Fortran 編譯器執行時期程式庫,可能還有其他程式庫)。因此,這類 Wheel 僅能在建構它們的系統上執行。有關更多背景資訊,請參閱 pypackaging-native 內容中「建構和安裝或上傳產出物」 的部分。

因此,這樣的 Wheel 是產生可發行的二進位檔的中間階段。最終的二進位檔也可能是一個 Wheel — 在這種情況下,執行 auditwheel (Linux)、delocate (macOS)、delvewheel (Windows) 或 repairwheel (平台獨立) 以將所需的共享程式庫 vendor 到 Wheel 中。

最終的二進位檔也可能採用其他封裝格式(例如,.rpm.deb.conda 套件)。在這種情況下,有特定於封裝生態系統的工具,可先將 Wheel 安裝到暫存區,然後使該安裝位置中的擴充模組可重新定位(例如,透過重寫 RPATH),然後將其重新封裝為最終的套件格式。

建構和執行時期依賴性#

建構 SciPy 所需的 Python 建構和執行時期依賴性可以在 pyproject.toml metadata 中找到。請注意,對於 SciPy 的發行版本,依賴性可能會有上限。每個上限上方都有註解;在大多數情況下,封裝者可以自由移除或放寬這些上限(numpy 除外)。例如:

# The upper bound on pybind11 is preemptive only
"pybind11>=2.12.0,<2.13.0",

#   ...
#   3. The <2.3 upper bound is for matching the numpy deprecation policy,
#      it should not be loosened.
"numpy>=2.0.0rc1,<2.3",

非 Python 建構需求為

  • C、C++ 和 Fortran 編譯器

  • BLAS 和 LAPACK 程式庫

  • ninja

  • pkg-config

常見編譯器的最低版本在頂層 meson.build 檔案中強制執行。目前 LAPACK 的最低版本為 3.7.1。有關這些建構依賴性的更詳細資訊,請參閱 工具鏈路線圖

從 Wheel 或已安裝的套件中移除測試套件#

預設情況下,已安裝的 scipy 版本包含完整的測試套件。該測試套件,包括資料檔案和編譯後的僅用於測試的擴充模組,在 Wheel 中佔用約 4.5 MB(對於 x86-64,截至 v1.14.0),在磁碟上佔用更多空間。在二進位檔大小很重要的情況下,封裝者可能希望移除測試套件。從 SciPy 1.14.0 開始,有一種方便的方法可以做到這一點,即使用 Meson 的安裝標籤 功能。這是一行程式碼:

$ python -m build -wnx -Cinstall-args=--tags=runtime,python-runtime,devel

注意

請注意,在上述命令中,-wnx 表示 --wheel --no-isolation --skip-dependency-check。它假設封裝者已經設定了建構環境,這通常是發行版封裝的情況。安裝標籤功能在隔離建構中也同樣適用(例如 pip install scipy --no-binary -Cinstall-args=--tags=runtime,python-runtime,devel)。

如果您想要為測試本身產生一個單獨的套件,例如名稱為 scipy-tests,則編輯 pyproject.toml 以更改專案名稱

[project]
name = "scipy-tests"

然後使用以下命令建構:

$ python -m build -wnx -Cinstall-args=--tags=tests

上述命令將建構整個套件兩次;為了以快取方式重建,請使用 -Cbuild-dir=build 建構選項

$     $ # apply patch to change the project name in pyproject.toml
$ python -m build -wnx -Cbuild-dir=build -Cinstall-args=--tags=tests

最終結果看起來會像這樣

$ ls -lh dist/*.whl
...  20M  ...  dist/scipy-1.14.0-cp311-cp311-linux_x86_64.whl
...  4,5M ...  dist/scipy_tests-1.14.0-cp311-cp311-linux_x86_64.whl