Setup_requires mit Cython?

Ich setup.py eine setup.py Datei für ein Projekt mit einigen Cython Erweiterungsmodulen.

Ich habe das schon zur Arbeit gebracht:

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

Das ist gut Dies setzt jedoch voraus, dass Cython installiert ist. Was ist, wenn es nicht installiert ist? Ich verstehe das ist, was die setup_requires Parameter ist für:

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

Allerdings, wenn Cython nicht bereits installiert ist, wird dies natürlich fehlschlagen:

 $ 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 

Was ist der richtige Weg, dies zu tun? Ich muss irgendwie Cython importieren, nur nachdem der setup_requires Schritt läuft, aber ich brauche Cython , um die ext_modules Werte anzugeben.

2 Solutions collect form web for “Setup_requires mit Cython?”

Sie müssen die from Cython.Build import cythonize in einem try-except , und in der except , definieren Sie cythonize als Dummy-Funktion. Auf diese Weise kann das Skript geladen werden, ohne mit einem ImportError .

Wenn später das Argument setup_requires behandelt wird, wird Cython installiert und das Setup-Skript wird erneut ausgeführt. Da zu diesem Zeitpunkt Cython installiert ist, kannst du cythonize erfolgreich importieren

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

BEARBEITEN

Wie in den Kommentaren erwähnt, wird nach der Einrichtung von füllenden Abhängigkeiten kein Cython geladen. Ich hatte noch nicht daran gedacht, aber du könntest auch einen spätbindenden Ansatz versuchen, sich cythonize

Ab 18.0 Release von setuptools (veröffentlicht am 2015-06-23) ist es möglich, Cython in setup_requires anzugeben und *.pyx für reguläre 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'], ), ], ) 
Python ist die beste Programmiersprache der Welt.