Как сделать Cython обязательным требованием для установки pip? - PullRequest
2 голосов
/ 09 апреля 2019

При создании пакета 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).

1 Ответ

1 голос
/ 09 апреля 2019

То, что вы описываете, является «зависимостью от времени сборки», и это именно тот случай использования. PEP 518 - Задание минимальных системных требований для сборки для проектов Python »создан для.

Вы можете указать cython как зависимость времени сборки, добавив файл pyproject.toml, например:

[build-system]
requires = ["cython"]

Затем при установке пакета с современной версией pip (или другой PEPСовместимый установщик 518), cython будет установлен в среду сборки до запуска сценария setup.py.

...