it-swarm.com.de

Umbrechen von C++ - Code mit Python (manuell)

Ich habe eine Hauptdatei (main.cpp) und eine Header-Datei (node.hpp). Die Hauptdatei verwendet N (eine beliebige positive ganze Zahl) als Eingabeargument. Wenn Sie die Funktionen der Header-Datei verwenden, erhalten Sie die Ausgabe beispielsweise 'x & y' (beide doppelt).

Hinweis:  

  1. Sowohl Haupt- als auch Header-Dateien werden in C++ geschrieben.
  2. Haupt- und Header-Dateien verwenden nicht die Datenstrukturen als Arrays oder Vektoren, sondern sie verwenden die Eigenbibliothek.

Ich muss einen Python-Wrapper für sie schreiben, ich habe gute Python-Kenntnisse, habe aber noch nie einen Wrapper verwendet. 

Kann jemand bitte verweisen oder ein paar Anmerkungen zur Verwendung von Python Wrpper für solchen Code geben? 

6
user7440094

Verwenden Sie Boost.Python. Hier ist mein Tutorial zu SO Docs.


Boost.Python verwenden

Die Dinge sind einfach, wenn Sie eine C++ - Bibliothek in einem Python-Projekt verwenden müssen. Sie können nur Boost verwenden.

Hier ist zunächst eine Liste der benötigten Komponenten:

  • Eine CMakeList.txt-Datei, da Sie CMake verwenden werden.
  • Die C++ - Dateien des C++ - Projekts.
  • Die Python-Datei - dies ist Ihr Python-Projekt.

Beginnen wir mit einer kleinen C++ - Datei. Unser C++ - Projekt hat nur eine Methode, die den String "Dies ist der erste Versuch" zurückgibt. Nennen Sie es CppProject.cpp

char const *firstMethod() {
    return "This is the first try.";
}

BOOST_PYTHON_MODULE(CppProject) {
    boost::python::def("getTryString", firstMethod); // boost::python is the namespace
}

Habe unten eine CMakeLists.txt-Datei:

cmake_minimum_required(VERSION 2.8.3)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(Boost COMPONENTS python)

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})

PYTHON_ADD_MODULE(NativeLib CppProject)
FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line

Durch diesen Teil des Tutorials ist alles so einfach. Sie können die Bibliothek und die Aufrufmethode in Ihr Python-Projekt importieren. Rufen Sie Ihr Python-Projekt auf MyProject.py .

import NativeLib
print (NativeLib.getTryString)

Um Ihr Projekt auszuführen, folgen Sie den Anweisungen unten:

  • Erstellen Sie ein Verzeichnis mit dem Namen build .
  • Geben Sie in dieses Verzeichnis ein.
  • Geben Sie den Befehl cmake -DCMAKE_BUILD_TYPE=Release ..
  • make
  • python MyProject.py. Nun müssen Sie den String sehen, den die Methode in Ihrem C++ - Projekt zurückgibt.
7
Onur Tuna

Hier sind Ihre Optionen:

  1. Sie können ctypes verwenden, und ich halte dies für die sauberste Lösung, da Sie Ihr Programm in eine gemeinsam genutzte Bibliothek konvertieren, die von jeder anderen Software aufgerufen werden kann, nicht nur von Python. Sie müssen jedoch selbst ein C-Interface für Ihr Programm schreiben.

  2. Sie können Python C-Extension verwenden, und ich halte dies für die schlechteste Lösung, da sie sehr niedrig ist und zu Speicherverlusten neigt und die Implementierung einer Funktion viel Zeit kostet und von der Python-Version abhängig ist . Grundsätzlich ist dies gut, um einen Python-Interpreter in C++ zu starten. Sie können PyObjects (der Hauptbaustein eines beliebigen Python-Typs) erstellen und mit ihnen in C/C++ behandeln.

  3. Sie können SWIG verwenden, wobei die Schnittstelle, die Sie mit ctypes erstellen müssen, über eine von Ihnen definierte Schnittstellendatei automatisch erstellt wird. Die Leute sagen, es ist sehr gut, aber die Dokumentation ist nicht so gut.

  4. Sie können Boost.Python verwenden, was zwar gut ist, aber mit bjam ein sehr hässliches Build-System hat. Wenn Sie das umgehen können, ist es sogar noch besser als ctypes. Ich bin ein großer Boost-Fan, aber aus diesem Grund verwende ich das nicht.

Was ich normalerweise mache, ist ctypes. Ich vertraue darauf, weil es das Prinzip Single-Reponsibility betont. Die Bibliothek verfügt über einen Job, der von der Schnittstelle (der C-Schnittstelle) getrennt ist. Sie ist auch von Ihrem Python-Skript getrennt, das diese Schnittstelle verwendet und dem Benutzer die "einfache Funktionalität" zur Verfügung stellt.

Ein anderes Werkzeug für die Generierung von C++ - Wrappern ist CLIF . Google wurde im Jahr 2017 veröffentlicht und verwendet dies heute für fast alles. Neue SWIG-Wrapper dürfen nicht mehr intern für Python geschrieben werden.

Es basiert auf Clang für das C++ - Parsing und erfordert eine relativ idiomatische, moderne C++ - API-Verwendung (nicht überraschend nach Googles Style Guide ), anstatt jeden Versuch, Ihnen zu erlauben, sich über SWIG in den Fuß zu schießen, "unterstützen Sie alles schlecht". Ansatz.

2
gps

Versuchen Sie es mit offiziellen Unterlagen:

https://docs.python.org/2/extending/extending.html

dieser Link zeigt Ihnen ein einfaches Beispiel, wie Sie ein CPP-Modul einfügen und vom Python-Interpreter aus verwenden können. Falls dies möglich ist, versuchen Sie es mit Cython: http://cython.org/

Cython erlaubt es Ihnen, C-artigen, Python-artigen Code zu schreiben, der in CPP übersetzt wird und dann von Python aus leicht zugänglich ist.

1
mucka

Sie können Boost.Python verwenden.

oder gehen Sie mit der Python native Schnittstelle

Ich würde Boost.Python empfehlen, wenn Sie bereits Boost eingerichtet haben. 

0
mutantkeyboard