Quelle est la meilleure façon de faire une extension en option C pour un paquet python?
-
27-09-2019 - |
Question
J'ai créé une extension C que je voudrais activer dans mon paquet Python (en utilisant setuptools) uniquement si une option de ligne de commande est transmise. Quelle est la meilleure façon de le faire?
Je ne peux pas sembler trouver des façons d'aller simples à ce sujet.
La solution
ext_modules = []
if '--add-this' in sys.argv:
ext_modules.append(Extension(...))
sys.argv.remove('--add-this')
setup(...
ext_modules = ext_modules
)
Ceci est hacky, mais peut-être plus facile. Une approche plus avancée serait d'étendre la classe de distribution afin de soutenir un drapeau, par exemple --with-modules
puis personnaliser l'intérieur ext_modules finalize_options.
Autres conseils
Il est en fait un distribuer / setuptools fonctionnalité appelée « Fonctions » qui peuvent être utilisés pour cela.
Il est conçu explicitement d'avoir setup.py faire des choses différentes en fonction des options de ligne de commande et de --with-xxx
--without-xxx
.
- billet de blog donne une bonne introduction, je ne peux pas trouver une meilleure documentation à ce moment (en plus de la source Distribution - la classe d'entités et propose mot-clé).
- Le projet de Jinja setup.py les utilisations Caractéristiques de votre objectif précis , il pourrait être un bon modèle pour travailler.
- setup.py fait aussi quelque chose de similaire, sauf qu'il est codé pour toujours essayer de construire la fonction C-extension, il définit, et à l'arrière tomber grâce à python pur quand la construction échoue; cela peut aussi être utile pour vos besoins.