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 'hi, python!'"); 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_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.