Ich möchte mein C ++ Projekt mit einer Python-Schnittstelle versehen. Technisch habe ich mich entschieden, Cython zum Einbinden des C ++ - Codes zu verwenden. Im Laufe der Zeit soll das gesamte Projekt ein Python-Erweiterungsmodul werden, aber das ist zunächst sehr experimentell. Allmählich müssen C ++ - Klassen Python zugänglich gemacht werden.
Meine Frage ist, wie man Dateien am besten organisiert und Konfigurationen baut, damit Cython-generierter und von Menschen geschriebener C ++ - Code nicht vermischt wird und das Python-Erweiterungsmodul sauber von den anderen Zielen getrennt aufgebaut wird.
Ich stelle mir eine Verzeichnisstruktur wie diese für die Quelldateien und ein Build-Verzeichnis für Cython vor.
%Vor%Grundsätzlich habe ich 3 Ordner:
CPROJECT
, Die C ++ - Bibliothek: Erzeugt ein libcproject.so
shared object CYPROJECT
, Die zythonisierte Python-Erweiterung: Erzeugen des cyproject.so
mit Cython DEPENDENCIES
, Die Abhängigkeiten: Hier kopiere ich externe Anforderungen für beide Projekte In 1. Ich erstelle die C ++ Erweiterung (kompiliert mit gcc - -shared
, -fPIC
Kompilieroptionen), die Python zur Verfügung stellt und auf die CYPROJECT
angewiesen ist, um Features zu enthüllen zu Python. Als Nachbearbeitungsbefehl wird das resultierende .so
in DEPENDENCIES/libcproject/
(sowie die include
-Dateien) kopiert. Auf diese Weise ist die Bibliothek natürlich auch unabhängig in einem reinen C ++ - Projekt verwendbar.
In 2. Ich verwende 3 Unterordner:
adapters
: enthält hauptsächlich zusätzliche C ++ - Klassen (oft Klassen, die von denen abgeleitet sind, die von libcproject.so
bereitgestellt werden). Dies sind normalerweise Klassen, die mit spezifischen Cython-spezifischen Funktionalitäten ausgestattet sind (z. B. Speichern der PyObject *
C-Version einer zielgerichteten Python-Version - geerbt von object
- einer bestimmten Klasse und der Referenzzählungsverwaltung über Py_XINCREF
und Py_DECREF
, ...). pyext
: wo sind alle handgeschriebenen Cython .pyx
Dateien gespeichert. setup
: Enthält das Skript setup.sh
(zum Einrichten der Abhängigkeitenspfade und Aufrufen von python setup.py build_ext --inplace
zum Generieren der letzten cyproject.so
(zu PYTHONPATH
hinzufügen) und cyproject.pyx
. Also, was ist im setup
Unterordner?
Hier ist ein Beispielcode für setup.sh
:
Und hier ein Beispiel von setup.py
(hauptsächlich um zu demonstrieren, wie die zusätzlichen adapters
kompiliert werden):
Und schließlich die Haupt- .pyx
, die alle handgeschriebenen .pyx
s des Cython-Teils miteinander verbindet [ cyproject.pyx
]:
Hinweis: Alle von Cython generierten Dateien verbleiben wie erwartet in diesem setup
-Ordner, getrennt von den handgeschriebenen Inhalten ( adapters
und pyext
).
In 3. Die Verwendung eines getrennten Ordners DEPENDENCIES
ermöglicht es, die Dinge gut getrennt zu halten (für den Fall, dass ich CYPROJECT
- und seine Abhängigkeiten in einer anderen Umgebung verschieben würde).
All dies, um Ihnen einen Überblick zu geben (wie ich hoffe), wie man diese Art von Projekt organisieren kann.