Статус 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), и вы хотите использовать хорошо спроектированную, современную и надёжную систему сборки, мы рекомендуем:
Mesonдолжны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN meson-python сборка backend
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 чтобы избежать будущих проблем - см.
Для авторов нижестоящих пакетов.