状态numpy.distutils和迁移建议#

numpy.distutils已在 NumPy 中弃用1.23.0。 Python 3.12 中它将被删除;对于 Python <= 3.11,它直到 Python 3.12 发布 2 年后(2025 年 10 月)才会被删除。

警告

numpy.distutils仅测试过,较新的版本可能会崩溃。有关详细信息,请参阅numpy.distutils 与 setuptools 的交互setuptools < 60.0

迁移建议#

有几个构建系统是迁移的不错选择。假设您已经在包中编译了代码(如果没有,您有几个不错的选择,例如 Poetry、Hatch 或 PDM 提供的构建后端)并且您希望使用设计良好、现代且可靠的构建系统,我们建议:

  1. Mesonmeson-python构建后端

  2. CMakescikit-build-core构建后端

如果您有适度的需求(仅简单的 Cython/C 扩展;不需要 Fortran、BLAS/LAPACK、嵌套setup.py文件或 的其他功能 )并且到目前为止numpy.distutils已经满意,您也可以考虑切换到.请注意, 的大多数功能 不太可能移植到.numpy.distutilssetuptoolsnumpy.distutilssetuptools

转向介子#

SciPy 在 1.9.0 版本中已迁移到 Meson 和 meson-python。在此过程中,Meson 的 Python 支持和功能对等方面的剩余问题numpy.distutils得到了解决。注意:奇偶校验意味着一个大的超集(因为 Meson 是一个很好的通用构建系统);仅缺少一些 BLAS/LAPACK 库选择细节。 SciPy 使用了几乎所有提供的功能numpy.distutils,因此如果 SciPy 成功地以 Meson 作为构建系统进行了发布,那么就不会有任何阻碍进行迁移,并且 SciPy 将成为其他正在迁移的包的一个很好的参考。有关 SciPy 迁移的更多详细信息,请参阅:

在 1.26 版本中,NumPy 将迁移到 Meson。

转向 CMake / scikit-build #

下一代 scikit-build 称为scikit-build-core。在下面scikit-build使用旧版本的地方setuptools,重写则没有。与 Meson 一样,CMake 是一个很好的通用构建系统。

搬到setuptools

对于仅numpy.distutils出于历史原因使用并且实际上不使用超出setuptools支持范围的功能的项目,迁移到setuptools可能是花费最少精力的解决方案。为了评估这一点,以下功能numpy.distutils存在setuptools

  • 嵌套setup.py文件

  • Fortran 构建支持

  • BLAS/LAPACK 库支持(OpenBLAS、MKL、ATLAS、Netlib LAPACK/BLAS、BLIS、64 位 ILP 接口等)

  • 支持其他一些科学库,例如 FFTW 和 UMFPACK

  • 更好的 MinGW 支持

  • 每个编译器构建标志自定义(例如-O3SSE2标志是默认值)

  • 一个简单的用户构建配置系统,请参见site.cfg.example

  • SIMD 内在函数支持

最广泛使用的功能是嵌套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.distutils# 的互动setuptools

建议使用。较新的版本可能有效,但不保证有效。原因是60.0 启用了 的供应商副本,包括影响.setuptools < 60.0setuptoolsdistutilsnumpy.distutils

如果您仅使用简单的 Cython 或 C 扩展,并且很少使用 numpy.distutils嵌套文件之外的功能setup.py(其最流行的功能,请参阅 参考资料Configuration),那么最新版本setuptools可能会继续工作。如果出现问题,您还可以尝试SETUPTOOLS_USE_DISTUTILS=stdlib避免setuptools.

无论您做什么,建议对您的setuptools 构建要求设置上限,pyproject.toml以避免将来出现损坏 - 请参阅 对于下游包作者