Frage

Ich habe ziemlich großen C ++ Bibliothek mit mehreren Teilbibliotheken, die sie unterstützen, und ich brauche das Ganze in eine Python-Erweiterung zu drehen. Ich verwende distutils weil es plattformübergreifend sein muss, aber wenn es ein besseres Werkzeug, das ich bin offen für Vorschläge.

Gibt es eine Möglichkeit distutils erste kompilieren die Unterbibliotheken zu machen, und verknüpfen sie in, wenn es eine Erweiterung aus der Hauptbibliothek erstellt?

War es hilfreich?

Lösung

ich sich nur mit einer massiven C ++ Bibliothek in unserem Produkt. Es gibt verschiedene Tools gibt, die können Sie die Aufgabe des Schreibens Bindungen automatisieren: Die beliebtesten ist SWIG , die hat schon eine Weile, wird in vielen Projekten eingesetzt und funktioniert im allgemeinen sehr gut.

Die größte Sache gegen SWIG (meiner Meinung nach) ist, dass die C ++ Code-Basis von SWIG selbst wirklich eher crufty ist es milde auszudrücken. Es wurde vor dem STL geschrieben und hat seinen eigenen halbdynamischen Typ-System, das jetzt nur noch alt und knarrende ist. Dies wird nicht viel aus, wenn Sie jemals in stecken müssen und einige Änderungen an den Kern zu machen (Ich habe einmal versucht, doxygen hinzufügen -> docstring Konvertierung), aber wenn Sie jemals tun, viel Glück für Sie! Die Leute sagen auch, dass SWIG generierte Code nicht effizient ist, was für mich wahr sein kann, aber ich habe nie die SWIG selbst nennt genug von einem Engpass sein um es zu sorgen.

Es gibt auch andere Werkzeuge, die Sie verwenden können, wenn SWIG Ihr Boot nicht schwimmen: boost.python ist auch sehr beliebt und könnte eine gute Option sein, wenn Sie bereits Boost-Bibliotheken in C ++ Code verwenden. Der Nachteil ist, dass es schwer auf dem Kompilierung Mal ist, da es so ziemlich alles, c ++ Vorlage basiert ist.

Diese beiden Werkzeuge benötigen Sie einige Arbeit up-front, um zu tun, was zu definieren, wird ausgesetzt sein und ganz wie wird es geschehen. Für SWIG bieten Ihnen Schnittstellendateien, die wie C ++ Header sind aber abgespeckte, und mit einigen zusätzlichen Richtlinien SWIG sagen, wie zu übersetzen komplexe Typen usw. diese Schnittstellen Schreiben kann sehr mühsam sein, so können Sie an so etwas wie pygccxml , um Ihnen automatisch generieren sie für Sie.

Der Autor dieses Paket tatsächlich schrieb eine andere Erweiterung, die Sie mögen vielleicht: py ++ . Dieses Paket macht zwei Dinge: Es kann Bindungsdefinitionen automatisch generiert, die dann zugeführt werden können, um Boost.Python Python-Bindungen zu erzeugen: im Grunde ist es die volle Lösung für die meisten Menschen ist. Vielleicht möchten Sie es starten, wenn Sie keine particulrly unüblichen oder schwierigen Anforderungen gerecht zu werden.

Einige andere Fragen, die als Referenz könnte sich als nützlich erweisen:

Sie können auch dieser Vergleich von Bindungswerkzeuge für Python praktisch. Wie Alex weist aber jetzt sein in den Kommentaren aus ziemlich alt, aber zumindest gibt Ihnen eine Vorstellung von der Landschaft ...

Im Hinblick darauf, wie die Build zu fahren, können Sie in einem fortgeschritteneren gebaut Werkzeug aussehen wollen, dass distutils: Wenn Sie mit Python bleiben wollen würde ich empfehlen Waf als Rahmen (andere werden Ihnen sagen, SCons ist der Weg zu gehen, aber glauben Sie mir, es wie die Hölle langsam ist: ich habe schon hin und her gewesen) ... es dauert ein wenig Lernen, aber wenn Sie Ihren Kopf bekommen um es ist extrem leistungsfähig!. Und da es rein ist Python wird es fügen sich perfekt mit jedem anderen Python Code, den Sie als Teil Ihres Build-Prozess haben (sagen wir zum Beispiel Sie Py ++ verwenden, am Ende) ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top