Heim > Backend-Entwicklung > Python-Tutorial > Einbettung von Python in C/C++

Einbettung von Python in C/C++

黄舟
Freigeben: 2016-12-17 16:32:06
Original
1949 Leute haben es durchsucht

Es ist relativ einfach, Python in C/C++ einzubetten. Zuerst müssen Sie das Include-Dateiverzeichnis und das lib-Dateiverzeichnis von Python in VC hinzufügen:
Öffnen unter VC6.0 Extras->Optionen->Verzeichnisse->Verzeichnisse anzeigen Fügen Sie dazu das Verzeichnis „inlude“ im Python-Installationsverzeichnis zum Element „Include-Dateien“ hinzu und fügen Sie das Verzeichnis „libs“ zur Bibliothek hinzu Dateielement.
Öffnen Sie unter VC2005 das Verzeichnis „Tools->Optionen->Projekte und Lösungen->VC++“ und führen Sie dann die gleiche Arbeit aus.

Der Code lautet wie folgt:

//在debug下执行出错,“无法找到python31_d.lib文件”,后查到原因是:在debug下生成必须要有python31_d.lib文件,否则只能在release下生成
#include <python.h>
int main()
{
    Py_Initialize();
    PyRun_SimpleString("Print &#39;hi, python!&#39;");
    Py_Finalize();
    return 0;
}
Nach dem Login kopieren

Der Prototyp der Py_Initialize-Funktion lautet: void Py_Initialize(), diese Funktion muss beim Einbetten von Python-Skripten verwendet werden. Sie initialisiert den Python-Interpreter und wird bei Verwendung anderer Python/C verwendet Diese Funktion muss vor der API aufgerufen werden. Mit der Funktion Py_IsInitialized können Sie feststellen, ob die Initialisierung erfolgreich ist, und bei Erfolg True zurückgeben.
Der Prototyp der PyRun_SimpleString-Funktion ist int PyRun_SimpleString(const char *Befehl), der zum Ausführen eines Teils des Python-Codes verwendet wird. Hinweis: Müssen Sie den Einzug zwischen Anweisungen beibehalten?
Py_Finalize-Funktionsprototyp ist ungültig Py_Finalize() wird verwendet, um den Python-Interpreter zu schließen und die vom Interpreter belegten Ressourcen freizugeben.

Die Funktion PyRun_SimpleFile kann zum Ausführen von „.py“-Skriptdateien verwendet werden. Der Funktionsprototyp lautet wie folgt:
int PyRun_SimpleFile(FILE *fp, const char *filename);
its Dabei ist fp der Zeiger auf die geöffnete Datei und Dateiname der Name der auszuführenden Python-Skriptdatei. Da diese Funktion jedoch offiziell von Visual Studio veröffentlicht wurde Wenn mit 2003.NET kompiliert wird und andere Versionen des Compilers verwendet werden, kann die FILE-Definition aus Versionsgründen zu einem Absturz führen. Gleichzeitig können Sie der Einfachheit halber die folgende Methode verwenden, um diese Funktion zu ersetzen:
PyRun_SimpleString("execfile(‘file.py')"); //Execfile zum Ausführen von Python-Dateien verwenden

Py_BuildValue() wird zum Konvertieren von Zahlen und Zeichenfolgen in entsprechende Datentypen in Python verwendet (in der Sprache C werden alle Python-Typen als PyObject-Typ deklariert). Der Funktionsprototyp lautet wie folgt folgt:
PyObject *Py_BuildValue(const char *format, …..);
PyString_String() wird verwendet, um Variablen vom Typ PyObject* in den Typ char* zu konvertieren, die von der C-Sprache verarbeitet werden können. Der spezifische Prototyp lautet wie folgt:
char*. PyString_String(PyObject *p);

Listenoperationsfunktion:
PyObject * PyList_New(Py_ssize_t len);
int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item);
PyObject * PyList_GetItem(PyObject *list, Py_ssize_t index);
int PyList_Append(PyObject *list, PyObject *item);
int PyList_Sort(PyObject *list);
int PyList_Reverse(PyObject *list);
Py_ssize_t PyList_Size(PyObject *list);

Tuple operation function:
int PyTuple_New(Py_ssize_t len);
int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o);
PyObject * PyTuple_GetItem(PyObject *p, Py_ssize_t pos);
int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize); //Beachten Sie, dass es sich um einen **-Zeiger handelt

Wörterbuchoperationsfunktion:
PyObject * PyDict_New();
int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
PyObject* PyDict_GetItemString(PyObject *p, const char *key);
//Entspricht PyDict_SetItemString
int PyDict_DelItem(PyObject *p, PyObject *key);
int PyDict_DelItemString(PyObject *p, char *key);
//Entspricht PyDict_SetItemString
int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
PyObject* PyDict_Items(PyObject *p);
PyObject* PyDict_keys(PyObject *p);
PyObject* PyDict_Values(PyObject *p);

Die Verwendung von Python-Objekten in C/C++ sollte Probleme bei der Referenzzählung korrekt behandeln, andernfalls kann es leicht zu Speicherverlusten kommen. Bei Verwendung von Python/C Nachdem Funktionen in der API Listen, Tupel, Wörterbücher usw. erstellt haben, sollten Sie Makros wie Py_CLEAR() und Py_DECREF() verwenden, um diese Objekte nach Abschluss der Operationen an ihnen zu zerstören. Der Prototyp lautet wie folgt:
void Py_CLEAR(PyObject *o);
void Py_DECREF(PyObject *o);
Unter diesen kann der Parameter für die Funktion Py_CLEAR ein NULL-Zeiger sein, was bedeutet, dass keine Operation ausgeführt wird, aber die Funktion Py_DECREF kann kein NULL-Zeiger sein, da sonst ein Fehler auftritt.

Verwenden Sie die Funktion PyImport_Import(), um ein Python-Modul in C zu importieren und ein Modulobjekt zurückzugeben. Der Funktionsprototyp ist:
PyObject* PyImport_Import(PyObject *name);
Die Funktion PyModule_GetDict() kann die Funktionsliste im Python-Modul abrufen und ein Wörterbuch zurückgeben. Der Schlüssel im Wörterbuch ist der Funktionsname und der Wert ist die Aufrufadresse der Funktion. Der Prototyp lautet wie folgt:
PyObject* PyModule_GetDict(PyObject *module);
Verwenden Sie die Funktionen PyObject_CallObject() und PyObject_CallFunction(), um Funktionen in Python aus C aufzurufen. Der Prototyp sieht wie folgt aus:
PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args);
//args liegt in Tupelform vor
PyObject* PyObject_CallFunction(PyObject *callable, char *format, ...);
//format ist ein Parametertyp ähnlich „iss“, gefolgt vom angegebenen Parameter
Sie können PyCallable_Check(func) verwenden, um zu bestimmen, ob die Funktion aufgerufen werden kann, und wenn ja, True zurückgeben dürfen.

Das Obige ist der Inhalt der Einbettung von Python in C/C++. Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn).


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage