Ich lese die folgenden zwei Threads in der C-Bibliothek ein und C ++ - Bibliothek , ich bin mir nicht sicher, ob ich das bekomme es jetzt. Die C ++ - Bibliothek, mit der ich arbeite, verwendet Klasse und Vorlage, aber nicht auf übertriebene Weise. Was sind Probleme oder Vorbehalte beim Einbetten von Ctypes (abgesehen davon, dass Sie das in reinem Python usw. tun können)?
PyCXX, Cython und boost :: python sind drei andere Möglichkeiten, die Leute erwähnt haben, gibt es einen Konsens darüber, welcher für C ++ besser geeignet ist?
Danke
Oliver
Für C ++ - Bibliotheken, auf die von Python zugegriffen werden kann, müssen C-Exportnamen verwendet werden, was bedeutet, dass eine Funktion namens foo
von ctypes als foo
zugänglich ist.
Dies kann only erreicht werden, indem die öffentliche Schnittstelle mit export C {}
eingeschlossen wird, was wiederum das Überladen von Funktionen und Vorlagen verhindert (nur die öffentliche Schnittstelle der zu umwickelnden Bibliothek ist relevant, die innere) Arbeiten sind nicht und können alle C ++ - Funktionen verwenden, die sie mögen).
Grund dafür ist, dass C ++ - Compiler einen Mechanismus namens name mangling verwenden, um eindeutige Namen für überladene oder vorlagenbasierte Symbole zu generieren. Während ctypes
immer noch eine Funktion finden würde, vorausgesetzt, Sie wüssten seinen verkrüppelten Namen, hängt das Mangling-Schema vom verwendeten Compiler / Linker ab und ist nichts, auf das Sie sich verlassen können. Kurz gesagt: Verwenden Sie keine ctypes, um Bibliotheken, die C ++ - Funktionen verwenden, in die öffentliche Schnittstelle zu integrieren.
Cython
verfolgt einen anderen Ansatz. Es unterstützt Sie bei der Erstellung eines C-Erweiterungsmoduls, das die Schnittstelle mit der ursprünglichen Bibliothek herstellt. Daher erfolgt die Verknüpfung mit der C ++ - Bibliothek durch den regulären C ++ - Verknüpfungsmechanismus, wodurch das zuvor erwähnte Problem vermieden wird. Das Problem mit Cython ist, dass C-Erweiterungsbibliotheken für jede Plattform neu kompiliert werden müssen, aber das gilt auch für die C ++ - Bibliothek, die ebenfalls umschlossen wird.
Persönlich würde ich sagen, dass in den meisten Fällen die Zeit, Cython zu starten, eine Zeit ist, die gut ausgegeben wird und sich im Vergleich zu Ctypen letztendlich auszahlt (mit Ausnahme von wirklich einfachen Cish-Interfaces).
Ich habe keine Erfahrung mit boost.python
, daher kann ich nichts dazu sagen (allerdings habe ich nicht den Eindruck, dass es auch sehr beliebt ist).
Zur Verteidigung von boost::python
, gegeben Alexander Antwort auf Ctypes:
Boost Python bietet eine sehr "C ++" Schnittstelle zwischen C ++ - und Python-Code - selbst das Ausführen von Python-Unterklassen von C ++ - Klassen zum Überschreiben von virtuellen Methoden ist relativ einfach. Hier ist eine Liste der guten Eigenschaften:
std::vector<>
, std::map<>
Instanzen und Python Listen und Wörterbüchern (mit vector_indexing_suite
und map_indexing_suite
) boost::shared_ptr
, usw.) mit Python-Referenzzählungen (und Sie können dies auf jeden intelligenten Zeiger erweitern). Wenn Sie ein Design haben, bei dem Sie eine C ++ - Oberfläche in einer Sprache darstellen möchten, die Ihnen die Sprache betrifft, dann ist boost :: python wahrscheinlich der beste Weg, dies zu tun.
Die einzigen Nachteile sind die erhöhte Kompilierzeit (boost :: python macht ausgiebig Gebrauch von Templates) und manchmal undurchsichtige Fehlermeldungen, wenn Sie die Dinge nicht richtig machen.
Tags und Links python boost-python ctypes