Projektorganisation mit Cython und C ++

8

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%     
clstaudt 28.05.2013, 13:01
quelle

1 Antwort

5

Grundsätzlich habe ich 3 Ordner:

  1. CPROJECT , Die C ++ - Bibliothek: Erzeugt ein libcproject.so shared object
  2. CYPROJECT , Die zythonisierte Python-Erweiterung: Erzeugen des cyproject.so mit Cython
  3. 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 :

%Vor%

Und hier ein Beispiel von setup.py (hauptsächlich um zu demonstrieren, wie die zusätzlichen adapters kompiliert werden):

%Vor%

Und schließlich die Haupt- .pyx , die alle handgeschriebenen .pyx s des Cython-Teils miteinander verbindet [ cyproject.pyx ]:

%Vor%

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.

    
Gauthier Boaglio 29.05.2013, 05:39
quelle

Tags und Links