setup_requires с Cython?

Я создаю файл setup.py для проекта с некоторыми модулями расширения Cython.

Я уже получил это для работы:

 from setuptools import setup, Extension from Cython.Build import cythonize setup( name=..., ..., ext_modules=cythonize([ ... ]), ) 

Это прекрасно. Однако это предполагает, что Cython установлен. Что делать, если он не установлен? Я понимаю, что это параметр setup_requires для:

 from setuptools import setup, Extension from Cython.Build import cythonize setup( name=..., ..., setup_requires=['Cython'], ..., ext_modules=cythonize([ ... ]), ) 

Однако, если Cython еще не установлен, это, конечно, потерпит неудачу:

 $ python setup.py install Traceback (most recent call last): File "setup.py", line 2, in <module> from Cython.Build import cythonize ImportError: No module named Cython.Build 

Каков правильный способ сделать это? Мне нужно каким-то образом импортировать Cython только после setup_requires шага setup_requires , но мне нужно Cython , чтобы указать значения ext_modules .

2 Solutions collect form web for “setup_requires с Cython?”

Вы должны from Cython.Build import cythonize в try-except , а в except – определить cythonize как фиктивную функцию. Таким образом, скрипт может быть загружен без ImportError с ImportError .

Затем, когда setup_requires аргумент setup_requires , Cython будет установлен, и скрипт установки будет повторно выполнен. Поскольку в этот момент Cython установлен, вы сможете успешно импортировать cythonize

 try: from Cython.Build import cythonize except ImportError: def cythonize(*args, **kwargs): from Cython.Build import cythonize return cythonize(*args, **kwargs) 

РЕДАКТИРОВАТЬ

Как отмечено в комментариях, после того, как setuptools имеет дело с отсутствующими зависимостями, он не перезагрузит Cython. cythonize я не думал об этом, но вы также можете попробовать использовать поздний привязку для cythonize

Начиная с 18.0 выпуска setuptools (выпущенный в 2015-06-23), можно указать Cython в setup_requires и передать источники *.pyx модулей для регулярного setuptools.Extension :

 from setuptools import setup, Extension setup( # ... setup_requires=[ # Setuptools 18.0 properly handles Cython extensions. 'setuptools>=18.0', 'cython', ], ext_modules=[ Extension( 'mylib', sources=['src/mylib.pyx'], ), ], ) 
  • Каков правильный способ обмена версией пакета с помощью setup.py и пакета?
  • setup.py проверить, существует ли зависимость библиотеки, отличной от python
  • Как динамически добавлять и загружать точки входа?
  • добавлять файлы данных в проекты python setup.py
  • Если py2exe включает мои файлы данных (например, include_package_data)
  • Как написать setup.py для twistd / twisted plugin, который работает с setuptools, распространяет и т. Д.?
  • Возможно ли потребовать PyQt из setuptools setup.py?
  • Можно ли выразить зависимую от платформы зависимость в setup.py, не создавая версии моего яйца для конкретной платформы?
  • Python - лучший язык программирования в мире.