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 от установки как яйцо
  • Доступ к собственным метаданным яйца питона
  • Ubuntu + virtualenv = беспорядок? virtualenv ненавидит dist-пакеты, хочет сайты-пакеты
  • pip установить тестовые зависимости для tox из setup.py
  • В чем преимущество установки zip_safe в True при упаковке проекта Python?
  • Как я могу перемещать глобальные пакеты в виртуальную среду после создания виртуальной среды?
  • Как обрабатывать зависимость от scipy в setup.py
  • Как я могу заставить этот long_description и README отличаться несколькими предложениями?
  • Плюсы и минусы «скрипта» и «entry_point» в сценариях командной строки Python
  • Если py2exe включает мои файлы данных (например, include_package_data)
  • Установите два модуля python с тем же именем
  • Python - лучший язык программирования в мире.