python - create - setup_requires con Cython?
python setuptools setup (2)
A partir de la versión 18.0 de setuptools (publicado el 2015-06-23) es posible especificar Cython en setup_requires y pasar las fuentes de los módulos *.pyx para setuptools.Extension regulares. 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''],
),
],
)
Estoy creando un archivo setup.py para un proyecto con algunos módulos de extensión de Cython.
Ya he conseguido que esto funcione:
from setuptools import setup, Extension
from Cython.Build import cythonize
setup(
name=...,
...,
ext_modules=cythonize([ ... ]),
)
Esto se instala bien. Sin embargo, esto supone que Cython está instalado. ¿Qué pasa si no está instalado? Entiendo que esto es lo que el parámetro setup_requires es para:
from setuptools import setup, Extension
from Cython.Build import cythonize
setup(
name=...,
...,
setup_requires=[''Cython''],
...,
ext_modules=cythonize([ ... ]),
)
Sin embargo, si Cython aún no está instalado, esto, por supuesto, fallará:
$ 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
¿Cuál es la forma correcta de hacer esto? Necesito importar Cython alguna manera solo después de que se setup_requires paso setup_requires , pero necesito Cython para especificar los valores de ext_modules .
Debe ajustar la from Cython.Build import cythonize en un try-except , y en la except , defina cythonize como una función ficticia. De esta manera, el script se puede cargar sin fallar con un ImportError .
Luego, más tarde, cuando se setup_requires argumento setup_requires , se instalará Cython y se volverá a ejecutar el script de configuración. Dado que en ese momento se instala Cython , podrá importar con éxito cythonize
try:
from Cython.Build import cythonize
except ImportError:
def cythonize(*args, **kwargs):
from Cython.Build import cythonize
return cythonize(*args, **kwargs)
EDITAR
Como se señaló en los comentarios, después de que setuptools se ocupe de las dependencias faltantes, no volverá a cargar Cython. No lo había pensado antes, pero también podrías intentar un enfoque de enlace tardío para aplastar el cythonize