Heim  >  Artikel  >  php教程  >  Betten Sie Python in C/C++ ein

Betten Sie Python in C/C++ ein

高洛峰
高洛峰Original
2016-11-23 13:47:471556Durchsuche

Das Einbetten von Python in C/C ist ebenfalls relativ einfach. Zuerst müssen Sie das Python-Include-Dateiverzeichnis und das Lib-Dateiverzeichnis in VC hinzufügen:
Öffnen Sie unter VC6.0 die Verzeichnisse tools->options-> -> ;Verzeichnisse anzeigen für, fügen Sie das Inlude-Verzeichnis im Python-Installationsverzeichnis zum Element „Include-Dateien“ hinzu und fügen Sie das Verzeichnis „libs“ zum Element „Bibliotheksdateien“ hinzu.
Ö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;
}

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, wenn andere verwendet werden Python/ Diese Funktion muss vor der C-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 *command), der zum Ausführen eines Teils des Python-Codes verwendet wird. Hinweis: Müssen Sie den Einzug zwischen Anweisungen beibehalten?
Der Prototyp der Py_Finalize-Funktion ist void Py_Finalize(), mit dem der Python-Interpreter geschlossen und die vom Interpreter belegten Ressourcen freigegeben werden.

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);
wobei fp ist Der Zeiger auf die geöffnete Datei. Dateiname ist der Name der auszuführenden Python-Skriptdatei. Da die offizielle Version dieser Funktion jedoch von Visual Studio 2003.NET kompiliert wird, kann es bei Verwendung anderer Versionen des Compilers aus Versionsgründen zu einem Absturz der FILE-Definition kommen. 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 verwendet, um Zahlen und Zeichenfolgen in entsprechende Datentypen in Python umzuwandeln (in der Sprache C werden alle Python-Typen als PyObject-Typen deklariert. Der Funktionsprototyp lautet wie 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 ; *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 Referenzzählungsprobleme korrekt behandeln, andernfalls wird es leicht zu Speicherverlusten führen. Wenn Sie Funktionen in der Python/C-API zum Erstellen von Listen, Tupeln, Wörterbüchern usw. verwenden, sollten Makros wie Py_CLEAR() und Py_DECREF() verwendet werden, 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 anderem kann der Parameter für die Py_CLEAR-Funktion ein NULL-Zeiger sein, was bedeutet, dass er nein ist Die Operation wird ausgeführt, aber die Funktion Py_DECREF kann kein NULL-Zeiger sein, andernfalls tritt ein Fehler auf.

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. Das Schlüsselwort im Wörterbuch ist der Funktionsname und der Wert ist die Funktionsaufrufadresse. Der Prototyp lautet wie folgt:
PyObject* PyModule_GetDict(PyObject *module);
Verwenden Sie die Funktion PyObject_CallObject() und die Funktion PyObject_CallFunction(), um Funktionen in Python in C aufzurufen. Der Prototyp lautet wie folgt:
PyObject* PyObject_CallObject(PyObject * callable_object, PyObject *args);
//args ist eine Tupelform
PyObject* PyObject_CallFunction(PyObject *callable, char *format, …);
//format ist ein Parameter wie „iss“ Typ, gefolgt vom angegebenen Parameter
Sie können PyCallable_Check(func) verwenden, um zu bestimmen, ob die Funktion aufgerufen werden kann. Wenn ja, wird True zurückgegeben.



Stellungnahme:
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