При создании пакета Python и его загрузке в pypi
он автоматически установит требования, указанные в файле setup.py
в разделе install_requires
, например.
from distutils.core import setup
setup(
name = 'a_package',
packages = ['a_package'],
install_requires=['another_package']
)
Если пакет имеет расширение cython (и файлы .pyx
вместо файлов .c
/.cpp
), файлу setup.py
потребуется импортировать cython для создания устанавливаемого расширения, например.
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
name = 'a_package',
packages = ['a_package'],
install_requires=['another_package'],
cmdclass = {'build_ext': build_ext},
ext_modules = [Extension('the_extension', sources=['a_file.pyx'])]
)
Но так как Cython импортируется перед выполнением части setup
, при попытке установить этот пакет через pip
из исходников (а не с колеса), скачанного с pypi
, установить его не удастся из-за невозможности импорта cython
, так как он не дошел до части с требованиями.
Мне интересно, что можно сделать, чтобы pip
установка этого пакета из pypi
установила cython
до того, как он попытается его импортировать. Добавление requirements.txt
с cython
, похоже, не добавляет требований к автоматической установке для файлов, загруженных из pypi
.
Теперь я понимаю, что можно просто pip install cython
перед pip install thispackage
, но мне интересно, есть ли лучшее исправление, которое позволило бы установить пакет вместе с cython прямо из pypi
, когда невозможно запустить дополнительную команду (не прибегая к загрузке .c.
файлы и настроить файл setup.py
, чтобы использовать их вместо .pyx
).
То, что вы описываете, является «зависимостью времени сборки», и именно для этого варианта использования был создан «PEP 518 - Определение минимальных требований к системе сборки для проектов Python».
Вы можете указать cython
как зависимость времени сборки, добавив файл pyproject.toml
, например:
[build-system]
requires = ["cython"]
Затем при установке вашего пакета с помощью современной версии pip
(или другого установщика, совместимого с PEP 518) cython
будет установлен в среду сборки до запуска вашего сценария setup.py
.
Вам также нужно будет использовать setuptools
в вашем файле setup.py
. Поддержка PEP 518 не добавлялась (и, скорее всего, не будет) в distutils
.
Я вижу, что этот файл по умолчанию не включается в пакет с помощью
python setup.py sdist
- его нужно добавлять вMANIFEST.in
или это как-то влияет на файл пакета, сгенерированныйsetuptools
илиdistutils
?