setup create python build cython setuptools software-distribution

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