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. Mesonmeson-python 构建后端

  2. CMakescikit-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 可能是成本最低的解决方案.为了评估这一点,以下是 setuptools 中不存在的 numpy.distutils 功能:

  • 嵌套的 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 documentation

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 构建需求设置一个上限,以避免未来的破坏 - 参见 面向下游软件包作者 .