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