numpy.distutils 的狀態與遷移建議#

numpy.distutils 已在 NumPy 1.23.0 中被棄用。它將在 Python 3.12 版本中移除;對於 Python <= 3.11 版本,它將在 Python 3.12 版本發布後 2 年(2025 年 10 月)才會移除。

警告

numpy.distutils 僅在 setuptools < 60.0 版本中測試,較新版本可能會發生錯誤。詳情請參閱numpy.distutils 與 setuptools 的互動

遷移建議#

有幾種建置系統是遷移的良好選擇。假設您的套件中有編譯過的程式碼(如果沒有,您有幾個不錯的選擇,例如 Poetry、Hatch 或 PDM 提供的建置後端),並且您想要使用設計良好、現代且可靠的建置系統,我們建議:

  1. Meson,以及 meson-python 建置後端

  2. CMake,以及 scikit-build-core 建置後端

如果您只有適度的需求(僅簡單的 Cython/C 擴充功能;不需要 Fortran、BLAS/LAPACK、巢狀 setup.py 檔案或 numpy.distutils 的其他功能),並且到目前為止對 numpy.distutils 感到滿意,您也可以考慮切換到 setuptools。請注意,numpy.distutils 的大多數功能不太可能移植到 setuptools

遷移到 Meson#

SciPy 已將其 1.9.0 版本遷移到 Meson 和 meson-python。在此過程中,Meson 的 Python 支援以及與 numpy.distutils 的功能對等性方面剩餘的問題已獲得解決。注意:對等性意味著一個大型超集(因為 Meson 是一個良好的通用建置系統);僅缺少一些 BLAS/LAPACK 函式庫選擇的細微之處。SciPy 幾乎使用了 numpy.distutils 提供的所有功能,因此,如果 SciPy 已成功發布以 Meson 作為建置系統的版本,則應該沒有阻礙遷移的因素,並且 SciPy 將成為其他正在遷移套件的良好參考範例。有關 SciPy 遷移的更多詳細資訊,請參閱:

NumPy 將在 1.26 版本中遷移到 Meson。

遷移到 CMake / scikit-build#

下一代 scikit-build 稱為 scikit-build-core。舊版的 scikit-build 在底層使用了 setuptools,而重寫的版本則沒有。與 Meson 類似,CMake 是一個良好的通用建置系統。

遷移到 setuptools#

對於僅因歷史原因而使用 numpy.distutils 的專案,並且實際上並未使用超出 setuptools 也支援的功能,遷移到 setuptools 可能是成本最低的解決方案。為了評估這一點,以下是 numpy.distutilssetuptools 中提供的功能:

  • 巢狀 setup.py 檔案

  • Fortran 建置支援

  • BLAS/LAPACK 函式庫支援(OpenBLAS、MKL、ATLAS、Netlib LAPACK/BLAS、BLIS、64 位元 ILP 介面等)

  • 支援一些其他科學函式庫,例如 FFTW 和 UMFPACK

  • 更佳的 MinGW 支援

  • 每個編譯器的建置旗標自訂(例如,預設為 -O3SSE2 旗標)

  • 簡單的使用者建置配置系統,請參閱 site.cfg.example

  • SIMD 內部函數支援

  • 支援 NumPy 特定的 .src 樣板格式,用於 .c/.h 檔案

最廣泛使用的功能是巢狀 setup.py 檔案。此功能或許仍有可能在未來移植到 setuptools(雖然這需要志願者,請參閱 gh-18588 以了解狀態)。僅使用該功能的專案可以在完成後遷移到 setuptools。如果專案僅使用幾個 setup.py 檔案,則將這些檔案的所有內容簡單地彙整到單個 setup.py 檔案中,然後遷移到 setuptools 也可能是有意義的。這涉及捨棄所有 Configuration 實例,並改用 Extension。例如:

from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
      version='1.0',
      ext_modules=[
          Extension('foopkg.foo', ['foo.c']),
          Extension('barpkg.bar', ['bar.c']),
          ],
      )

如需更多詳細資訊,請參閱 setuptools 文件

numpy.distutilssetuptools 的互動#

建議使用 setuptools < 60.0 版本。較新版本可能可以使用,但不保證能正常運作。原因是 setuptools 60.0 版本啟用了一個供應商版本的 distutils,其中包括向後不相容的變更,這些變更會影響 numpy.distutils 中的某些功能。

如果您僅使用簡單的 Cython 或 C 擴充功能,並且僅少量使用 numpy.distutils 功能(超出巢狀 setup.py 檔案之外的功能,這是它最受歡迎的功能,請參閱 Configuration),則最新的 setuptools 可能會繼續正常運作。如果發生問題,您也可以嘗試使用 SETUPTOOLS_USE_DISTUTILS=stdlib 來避免 setuptools 中向後不相容的變更。

無論您執行什麼操作,都建議在您的 pyproject.toml 中為 setuptools 建置需求設定上限,以避免未來發生錯誤 - 請參閱針對下游套件作者