Was ist der einfachste Weg, eine optionale C-Erweiterung für ein Python-Paket zu machen?
-
27-09-2019 - |
Frage
Ich habe eine C-Erweiterung erstellt, dass ich in meinem Python-Paket ermöglichen möge (Setuptools verwenden) nur dann, wenn eine Option Befehlszeile übergeben wird. Was ist der einfachste Weg, dies zu tun?
Ich kann keine einfache Wege zu gehen, darüber zu finden scheinen.
Lösung
ext_modules = []
if '--add-this' in sys.argv:
ext_modules.append(Extension(...))
sys.argv.remove('--add-this')
setup(...
ext_modules = ext_modules
)
Dies ist hacky, aber vielleicht am einfachsten sein. Ein weitergehender Ansatz wäre es, die Verteilung Klasse zu erweitern, um eine Flagge zu unterstützen, sagt --with-modules
und dann ext_modules innerhalb finalize_options anpassen.
Andere Tipps
Es gibt tatsächlich eine verteilen / Setuptools Feature „Features“ genannt, die dafür verwendet werden kann.
Es ist ausdrücklich entworfen haben setup.py auf --with-xxx
und --without-xxx
Kommandozeilenoptionen basierend verschiedene Dinge tun.
- Die Blog-Post eine schöne Einleitung gibt, kann ich keine bessere Dokumentation zu dieser Zeit (neben dem Verteilen Quelle finden - die Feature-Class und kennzeichnet Stichwort ).
- Die setup.py verwendet Funktionen für Ihre genauen Zweck , könnte es eine gute Vorlage Arbeit aus sein.
- Die simplejson setup.py auch macht etwas Ähnliches, Abgesehen davon, dass es immer codiert versuchen, die C-Erweiterung Funktion es definiert, zu bauen und wieder anmutig zu reinem python fallen, wenn Gebäude ausfallen; dies auch für Ihre Zwecke nützlich sein kann.