Статус numpy.distutils и рекомендации по миграции#

numpy.distutils был устаревшим в NumPy 1.23.0. Он будет удалён для Python 3.12; для Python <= 3.11 он не будет удалён до 2 лет после выпуска Python 3.12 (октябрь 2025).

Предупреждение

numpy.distutils тестируется только с setuptools < 60.0, более новые версии могут нарушить работу. См. Взаимодействие numpy.distutils с setuptools подробности.

Рекомендации по миграции#

Существует несколько систем сборки, которые являются хорошими вариантами для миграции. Предполагая, что у вас есть скомпилированный код в вашем пакете (если нет, у вас есть несколько хороших вариантов, например, бэкенды сборки, предлагаемые Poetry, Hatch или PDM), и вы хотите использовать хорошо спроектированную, современную и надёжную систему сборки, мы рекомендуем:

  1. Mesonдолжны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN meson-python сборка backend

  2. CMakeдолжны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN scikit-build-core сборка backend

Если у вас скромные потребности (только простые расширения Cython/C; нет необходимости в Fortran, BLAS/LAPACK, вложенных setup.py файлы или другие особенности numpy.distutils) и были довольны numpy.distutils до сих пор, вы также можете рассмотреть переход на setuptools. Обратите внимание, что большая часть функциональности numpy.distutils маловероятно, что будет портировано на setuptools.

Переход на Meson#

SciPy перешёл на Meson и meson-python для релиза 1.9.0. В ходе этого процесса оставшиеся проблемы с поддержкой Python в Meson и соответствием функциональности с numpy.distutils были разрешены. Примечание: паритет означает большое надмножество (поскольку Meson — хорошая система сборки общего назначения); отсутствуют только некоторые тонкости выбора библиотек BLAS/LAPACK. SciPy использует почти всю функциональность, которую numpy.distutils предлагает, поэтому если SciPy успешно выпустил версию с Meson в качестве системы сборки, не должно остаться препятствий для миграции, и SciPy будет хорошим ориентиром для других пакетов, которые мигрируют. Подробнее о миграции SciPy см.:

NumPy перейдёт на Meson для выпуска 1.26.

Переход на 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

  • Настройка флагов сборки для каждого компилятора (например, -O3 и SSE2 флаги установлены по умолчанию)

  • простая система конфигурации сборки пользователя, см. 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.distutils с setuptools#

Рекомендуется использовать setuptools < 60.0. Более новые версии могут работать, но не гарантируется. Причина этого в том, что setuptools 60.0 включил поставленную копию distutils, включая обратно несовместимые изменения, которые затрагивают некоторую функциональность в numpy.distutils.

Если вы используете только простые Cython или C расширения с минимальным использованием numpy.distutils функциональность за пределами вложенных setup.py файлов (его самая популярная функция, см. Configuration), затем последний setuptools вероятно, продолжит работать. В случае проблем вы также можете попробовать SETUPTOOLS_USE_DISTUTILS=stdlib чтобы избежать обратно несовместимых изменений в setuptools.

Что бы вы ни делали, рекомендуется установить верхнюю границу для вашего setuptools требование сборки в pyproject.toml чтобы избежать будущих проблем - см. Для авторов нижестоящих пакетов.