Durch die bisherige Serie das Beispiel (Anmerkung 2) in scikit-image Bewegen Sie sich wie es ist, Eingabedatei ändern, Mehrere Eingabedateien verarbeiten Schreiben Sie das Ergebnis in eine Datei GUI verwenden Link mit Netzwerk Code verbessern und Als Modul wiederverwenden Verarbeitungszeit messen und profilieren wurde angezeigt.
Sobald Sie es so weit beherrschen, möchten Sie es wahrscheinlich das nächste Mal aus der C / C ++ - Sprache verwenden.
Daher werde ich dieses Mal vorstellen, wie Python aus der C / C ++ - Sprache verwendet wird.
Verwenden Sie Python aus der C / C ++ - Sprache
Python-Skript mit system () -Funktion system("python myscript.py"); Auf diese Weise können Sie Python aus der Sprache C verwenden. fp=popen("python myscript.py","r"); Als Ergebnis können Sie das Ergebnis empfangen und ausführen.
Derzeit kann diese Methode problemlos durchgeführt werden, solange Sie die Sprache C verwenden können.
Herausforderungen für diese Methode: Jedes Mal, wenn der Prozess ausgeführt wird, wird der Python-Interpreter vom System oder Popen gestartet, was den Overhead verursacht. Wenn das auszuführende Python-Skript die trainierte Datei zur Vorbereitung der Verarbeitung lesen muss, wird der Overhead sehr groß.
Python-Standarddokumentation [Python in andere Anwendungen einbetten] (http://docs.python.jp/2/extending/embedding.html)
Python-Standarddokumentation 5.3. Reine Einbettung
Das Programm dient zur Ausführung der Funktionen im Python-Skript.
Dieser Ansatz erzeugt keine zusätzlichen Prozesse. Sie können ein Argument an den eingebetteten Python-Teil übergeben und das Ergebnis erhalten.
PyImport_Import(pName) Der Name des eingelesenen Moduls In diesem Beispiel geben wir hier den Namen des Python-Moduls an und führen die in diesem Modul enthaltenen Funktionen aus. (Um genau zu sein, gibt Python anscheinend den zu importierenden Modulnamen an und ruft das Modul (.py, .pyc, .pyd usw.) im aktuellen Verzeichnis gemäß der Einstellung seines PYTHONPATH auf. Wenn Sie eine Argumentstruktur wie "$ call ../multiply multiplizieren 3 2" in das Argument dieses Beispiels aufnehmen, PyImport_Import () schlägt fehl. )
Erhöhen Sie die Anzahl der im Modul enthaltenen Funktionen Sie können Folgendes tun:
.py:intmath.py
def multiply(a,b):
print "Will compute", a, "times", b
c = 0
for i in range(0, a):
c = c + b
return c
def add(a,b):
print "Will compute", a, " plus ", b
return a+b
def div(a,b):
print "Will compute", a, " div ", b
return a/b
Ausführungsergebnis
.txt:Ausführungsergebnis.txt
>call.exe intmath div 5 2
Will compute 5 div 2
Result of call: 2
2
>call.exe intmath multiply 6 3
Will compute 6 times 3
Result of call: 18
18
>call.exe intmath add 6 3
Will compute 6 plus 3
Result of call: 9
9
>
Es kann auch so gemacht werden.
Dieses Beispiel ist sehr gefährlich, da die über die Befehlszeile eingegebenen Werte nicht überprüft werden.
Sie können Python-Objekte wie folgt in C-Sprachdatenstrukturen konvertieren: long PyInt_AsLong(PyObject *io) http://docs.python.jp/2/c-api/int.html
double PyFloat_AsDouble(PyObject *pyfloat) http://docs.python.jp/2/c-api/float.html
Durch diese Einbettung und Verwendung in der Sprache C kann der Aufwand für das Starten des Python-Interpreters und das Wiederholen der Beendigung mit der Funktion system () und der Funktion popen () vermieden werden. Darüber hinaus sollte beachtet werden Py_Initialize(); pModule = PyImport_Import(pName); Py_Finalize(); Es ist auch wichtig sicherzustellen, dass Sie nur dann laufen, wenn Sie es wirklich brauchen.
bewirken: Die C / C ++ - Sprachseite hat den Vorteil, dass unabhängig davon, wie sich die Implementierung des Python-Moduls ändert, keine Neuerstellung erforderlich ist, solange sich die Schnittstelle des aufrufenden Moduls, der Funktion, des Arguments und des Rückgabewerts nicht ändert.
Ich lerne noch [Anmerkung 1].
Im Beispielprogramm von 5.3. Reine Einbettung Da die Funktionsargumente und Rückgabewerte ganzzahlige Typen sind, erstellen wir ein Programm, das sie einfach durch Gleitkomma ersetzt.
Das Schreiben eines eingebetteten Programms erfordert ein gutes Verständnis von Python und C und erfordert möglicherweise eine Besessenheit, es zum Laufen zu bringen. Es ist ziemlich ungewöhnlich, einen Python-Programmierer zu haben, der das Einbetten von Python beherrscht, nur weil Sie einen Python-Benutzer in Ihrer Nähe haben. Schreiben wir also ein Programm, das leicht umgeschrieben wurde, und versuchen, es zu imitieren.
LINK : fatal error LNK1104: cannot open file 'python27_d.lib' Wird in Visual Studio angezeigt. So verwenden Sie python27.lib sowohl im Release-Modus als auch im Debug-Modus wie folgt stackoverflow Es wurde geschrieben in.
#ifdef _DEBUG
#undef _DEBUG
#include <Python.h>
#define _DEBUG
#else
#include <Python.h>
#endif
Hinweis: Bei Verwendung von Python Embedded habe ich versucht, den Prozess mit dem Task-Manager anzuzeigen. Selbst als ich den Python-Modulteil ausführte, konnte ich bestätigen, dass der Prozess python.exe nicht erstellt wurde. Wenn Sie den Systembefehl oder Popen verwenden, versuchen Sie bitte, ihn einzubetten, da Sie das Starten von Python und die Anfangseinstellungen im Skript nicht viele Male wiederholen müssen.
Dinge zu schreiben, etc. Boost.Python C ++ eingebettet in Python mit Scipy.Weave Cython Numpy C-API Scipy Python Types and C-Structures
Hinweis 1: Wenn Sie die Anzahl der mit C / C ++ zu verknüpfenden Bibliotheken erhöhen, "benötigt diese Bibliothek diese Bibliothek, diese Bibliothek benötigt irgendwie mehr Bibliothek, und wenn Sie sie nicht verknüpfen, wird der bisher erstellte Teil erstellt. Ich kann es nicht einmal tun. " Es ist eher eine traurige Situation. Bei der Einbettung von Python in die C / C ++ - Sprache wird der Link hier geschrieben #include <Python.h> Ein Modul, das eine Zeile von enthält. Dieser Teil ist die Brücke zwischen der C / C ++ - Sprache und der Python-Sprache. Der Rest der Python-Sprache ist nicht verknüpft. Aus diesem Grund können Sie den zu importierenden Modulnamen im Beispielprogramm C als Befehlszeilenargument angeben. Es reicht aus, einen Python-Interpreter und eine Reihe von Python-Bibliotheken zu installieren. "Dieses Modul, dieses Modul und welches Modul" Es ist auch schön, eine endlose Zunahme der Anzahl der zu verknüpfenden Objekte verhindern zu können.
Hinweis: Im Fall von Visual Studio unter Windows wird angegeben, dass es nicht verknüpft werden kann, wenn sich die Version des Compilers ändert. Dies kann schwierig sein, wenn große Bibliotheken wie OpenCV erstellt werden. Beim Generieren einer Bibliothek für Python aus der C / C ++ - Erweiterung Cython muss die Version von Visual Studio identisch sein.
Hinweis 2: Der Grund für die Auswahl des Beispiels in Scikit-image ist, dass es bei der Ausführung des Beispiels nicht das Problem "Woher soll ich die erforderlichen Daten erhalten?" Verursacht.
Recommended Posts