wheel - python setuptools extension




setup_requires con Cython? (2)

È necessario from Cython.Build import cythonize il wrapping from Cython.Build import cythonize in una try-except , e cythonize , definire cythonize come una funzione fittizia. In questo modo lo script può essere caricato senza fallire con un ImportError .

Successivamente, quando viene gestito l'argomento setup_requires , Cython verrà installato e lo script di installazione verrà rieseguito. Poiché a quel punto Cython è installato, sarai in grado di importare con successo cythonize

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

MODIFICARE

Come notato nei commenti, dopo setuptools si occupa di dipendenze mancanti, non ricaricherà Cython. Non ci avevo pensato prima, ma potevi anche provare un approccio tardivo per l'eliminazione di cythonize

Sto creando un file setup.py per un progetto con alcuni moduli di estensione Cython.

Ho già ottenuto questo lavoro:

from setuptools import setup, Extension
from Cython.Build import cythonize

setup(
    name=...,
    ...,
    ext_modules=cythonize([ ... ]),
)

Questo si installa bene. Tuttavia, questo presuppone che Cython sia installato. Cosa succede se non è installato? Capisco che questo è ciò che il parametro setup_requires è per:

from setuptools import setup, Extension
from Cython.Build import cythonize

setup(
    name=...,
    ...,
    setup_requires=['Cython'],
    ...,
    ext_modules=cythonize([ ... ]),
)

Tuttavia, se Cython non è già installato, questo naturalmente fallirà:

$ 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

Qual è il modo corretto per farlo? Ho bisogno di importare in qualche modo Cython solo dopo l' setup_requires passaggio setup_requires , ma ho bisogno di Cython per specificare i valori ext_modules .


A partire dalla versione 18.0 di setuptools (rilasciata il 2015-06-23) è possibile specificare Cython in setup_requires e passare i *.pyx moduli *.pyx per *.pyx regolari. 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'],
        ),
    ],
)






software-distribution