2017-09-08 2 views
2

Je développe un paquet contenant des extensions Cython.Est-il sûr d'appeler `setup()` plusieurs fois dans un seul `setup.py`?

Selon https://github.com/pypa/pip/issues/1958 je vais utiliser setup_requires et reporter l'importation de Cython. La meilleure solution que je suis venu avec est d'appeler setup() deux fois dans setup.py:

... # initial imports 
setup(setup_requires=['cython']) 
from Cython.Build import cythonize 
bar = Extension('foo.bar', sources = ['bar.pyx']) 
setup(name = 'foo', 
     ... # parameters 
     ext_modules = cythonize([bar]), 
     ... # more parameters 
    ) 

Cependant, j'ai le sentiment que le nom de setup() suggère qu'il sera appelé une seule fois. Est-il sûr de l'appeler plusieurs fois comme je le fais?

Je ne peux pas simplement distribuer des roues parce que le paquet doit être disponible aussi pour les utilisateurs de Linux.

[EDIT]

Aussi je vois la question plus générale que de traiter avec le compilateur dépendances. On peut vouloir importer un paquet (par exemple sphinx ou pweave) pour prétraiter la description de son paquet.

Répondre

4

La réponse simple est: No. Une fois que vous appelez setup, il va analyser les arguments de la ligne de commande et commencer à faire son travail. Comme Cython dépendance, setup_requires ne peut pas aider ici. Il va probablement essayer de télécharger Cython sans installer. Comme SpotlightKid a commenté:

distutils ne pas essayer d'être un compilateur ou installer gcc en tant que dépendance soit

Selon le setuptools

cet argument (setup_requires) est nécessaire si vous utilisez des extensions distutils,

et ainsi, pas pour des packages comme Cython. Je pense que l'utilisateur est responsable d'installer Cython avant d'appeler setup.py. Si vous voulez fournir un message d'erreur plus convivial, essayez d'utiliser

try: 
    from Cython.Build import cythonize 
except ImportError: 
    # Kindly ask the user to install Cython 

Les messages suivants peuvent aider:

+0

« il analysera les arguments de ligne de commande et commencer à faire son travail "- c'est exactement ce qui m'a fait douter, mais est-il explicitement mentionné quelque part dans les docs? Quelqu'un peut vouloir injecter une dépendance non-compilateur dans un modèle similaire. – abukaj

+0

@abukaj Il n'est pas mentionné dans les documents, mais vous pouvez facilement le trouver dans le [source] (https://bitbucket.org/carljm/python-distutils/src/48c42eeaee4410d76675b637bcd401b8919ff19a/core.py?at=default&fileviewer= file-view-default # core.py-59). Plus important encore: même si cela est sûr, le setuptools n'aide pas vraiment dans cette situation. – gdlmx