Heim Backend-Entwicklung Python-Tutorial Eine ausführliche Analyse des C++-Aufrufs von Python-Modulen

Eine ausführliche Analyse des C++-Aufrufs von Python-Modulen

Feb 20, 2017 am 10:37 AM

Python bietet eine C++-Bibliothek, die es Entwicklern ermöglicht, Python-Module einfach aus C++-Programmen aufzurufen. Als Nächstes stellt Ihnen dieser Artikel das relevante Wissen zum Aufrufen von Python-Modulen in C++ vor. Freunde, die es benötigen, können darauf zurückgreifen.

Im Allgemeinen wissen diejenigen, die Spiele entwickelt haben, dass Lua und C++ gut kombiniert werden können Die Stärken des anderen nutzen und Lua-Skripte verwenden. Es wird wie eine dynamische Linkbibliothek verwendet und nutzt die Flexibilität der Skriptentwicklung gut aus. Als beliebte Allzweck-Skriptsprache kann Python dies ebenfalls. In einer C++-Anwendung können wir eine Reihe von Plug-Ins verwenden, um einige Funktionen mit einer einheitlichen Schnittstelle zu implementieren. Im Allgemeinen werden Plug-Ins mithilfe dynamischer Linkbibliotheken implementiert. Wenn sich die Plug-Ins häufig ändern, können wir stattdessen Python verwenden Plug-Ins (die in Textform als dynamische Linkbibliotheken bezeichnet werden können) erleichtern das Umschreiben von Skriptcode entsprechend sich ändernden Anforderungen, anstatt binäre dynamische Linkbibliotheken neu kompilieren und verknüpfen zu müssen. Die Flexibilität wird erheblich verbessert.

Als Leimsprache kann Python problemlos C, C++ und andere Sprachen aufrufen und auch Python-Module über andere Sprachen aufrufen.

Python bietet eine C++-Bibliothek, die es Entwicklern ermöglicht, Python-Module einfach aus C++-Programmen aufzurufen.

Eine spezifische Dokumentation finden Sie im offiziellen Leitfaden:

Python in eine andere Anwendung einbetten

Aufrufmethode

1 Link zur Python-Aufrufbibliothek

Das Python-Installationsverzeichnis enthält bereits Header-Dateien (einschließlich Verzeichnis) und Bibliotheksdateien (python27.lib unter Windows).

Sie müssen eine Verknüpfung zu dieser Bibliothek herstellen, bevor Sie sie verwenden können.

2 Rufen Sie direkt die Python-Anweisung auf

<code class="language-cpp hljs ">#include "python/Python.h"
int main()
{
Py_Initialize(); ## 初始化
PyRun_SimpleString("print &#39;hello&#39;");
Py_Finalize(); ## 释放资源
}
</code>
Nach dem Login kopieren

3 Laden Sie das Python-Modul und rufen Sie die Funktion auf

~/ Das Testverzeichnis enthält test.py:

<code class="language-python hljs ">def test_add(a, b):
print &#39;add &#39;, a, &#39; and &#39;, b
return a+b</code>
Nach dem Login kopieren

. Sie können die Funktion test_add über den folgenden Code aufrufen:

<code class="language-cpp hljs ">#include "python/Python.h"
#include <iostream>
using namespace std;
int main()
{
Py_Initialize(); // 初始化
// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性
string path = "~/test";
string chdir_cmd = string("sys.path.append(\"") + path + "\")";
const char* cstr_cmd = chdir_cmd.c_str();
PyRun_SimpleString("import sys");
PyRun_SimpleString(cstr_cmd);
// 加载模块
PyObject* moduleName = PyString_FromString("test"); //模块名,不是文件名
PyObject* pModule = PyImport_Import(moduleName);
if (!pModule) // 加载模块失败
{
cout << "[ERROR] Python get module failed." << endl;
return 0;
}
cout << "[INFO] Python get module succeed." << endl;
// 加载函数
PyObject* pv = PyObject_GetAttrString(pModule, "test_add");
if (!pv || !PyCallable_Check(pv)) // 验证是否加载成功
{
cout << "[ERROR] Can&#39;t find funftion (test_add)" << endl;
return 0;
}
cout << "[INFO] Get function (test_add) succeed." << endl;
// 设置参数
PyObject* args = PyTuple_New(2); // 2个参数
PyObject* arg1 = PyInt_FromLong(4); // 参数一设为4
PyObject* arg2 = PyInt_FromLong(3); // 参数二设为3
PyTuple_SetItem(args, 0, arg1);
PyTuple_SetItem(args, 1, arg2);
// 调用函数
PyObject* pRet = PyObject_CallObject(pv, args);
// 获取参数
if (pRet) // 验证是否调用成功
{
long result = PyInt_AsLong(pRet);
cout << "result:" << result;
}
Py_Finalize(); ## 释放资源
return 0;
}
</iostream></code>
Nach dem Login kopieren

Parameterübergabe

1 C++ übergibt Parameter an Python

Python-Parameter sind eigentlich Tupel, daher ist die Übergabe von Parametern tatsächlich die Konstruktion eines geeigneten Tupels.

Es gibt zwei häufig verwendete Methoden:

Verwenden Sie PyTuple_New, um ein Tupel zu erstellen, und PyTuple_SetItem, um den Tupelwert festzulegen

<code class="language-cpp hljs ">PyObject* args = PyTuple_New(3);
PyObject* arg1 = Py_BuildValue("i", 100); // 整数参数
PyObject* arg2 = Py_BuildValue("f", 3.14); // 浮点数参数
PyObject* arg3 = Py_BuildValue("s", "hello"); // 字符串参数
PyTuple_SetItem(args, 0, arg1);
PyTuple_SetItem(args, 1, arg2);
PyTuple_SetItem(args, 2, arg3);</code>
Nach dem Login kopieren

Verwenden Sie Py_BuildValue direkt, um Tupel zu erstellen

<code class="language-cpp hljs ">PyObject* args = Py_BuildValue("ifs", 100, 3.14, "hello");
PyObject* args = Py_BuildValue("()"); // 无参函数</code>
Nach dem Login kopieren

Formatzeichenfolgen wie i, s, f finden Sie in der Formatzeichenfolge

2 Python-Rückgabewert konvertieren

Was Sie beim Aufruf von Python erhalten, sind PyObject-Objekte. Sie müssen daher einige Funktionen in der von Python bereitgestellten Bibliothek verwenden, um den Rückgabewert in C++ zu konvertieren, z. B. PyInt_AsLong, PyFloat_AsDouble , PyString_AsString usw.

Sie können auch die Funktion PyArg_ParseTuple verwenden, um den Rückgabewert als Tupel zu analysieren.

PyArg_Parse ist auch eine Konvertierungsfunktion, die sehr praktisch ist.

Sowohl PyArg_ParseTuple als auch PyArg_Parse verwenden Formatzeichenfolgen

Hinweise

Sie müssen das Python-Arbeitsverzeichnis dorthin wechseln, wo sich das Modul befindet Es muss überprüft werden, ob das Laden des Moduls oder das Laden der Funktion erfolgreich ist. Andernfalls kann es zu einem Stapelfehler und zum Absturz des Programms kommen. Sie müssen Py_DECREF verwenden (PyObject*) zum Dereferenzieren des Objekts (für die Python-Garbage-Collection)

Das Obige ist das vom Herausgeber eingeführte relevante Wissen über C++-Aufrufe von Python-Modulen. Ich hoffe, es wird für alle hilfreich sein!

Für eine ausführlichere Analyse von C++-aufrufenden Python-Modulen beachten Sie bitte die chinesische PHP-Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Apr 01, 2025 pm 05:09 PM

Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Apr 02, 2025 am 07:18 AM

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer -Anfänger für Programmierungen? Wenn Sie nur 10 Stunden Zeit haben, um Computer -Anfänger zu unterrichten, was Sie mit Programmierkenntnissen unterrichten möchten, was würden Sie dann beibringen ...

Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Apr 01, 2025 pm 11:15 PM

Bei der Verwendung von Pythons Pandas -Bibliothek ist das Kopieren von ganzen Spalten zwischen zwei Datenrahmen mit unterschiedlichen Strukturen ein häufiges Problem. Angenommen, wir haben zwei Daten ...

Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Apr 02, 2025 am 07:15 AM

Wie kann man nicht erkannt werden, wenn Sie Fiddlereverywhere für Man-in-the-Middle-Lesungen verwenden, wenn Sie FiddLereverywhere verwenden ...

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Apr 01, 2025 pm 10:51 PM

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen an? Uvicorn ist ein leichter Webserver, der auf ASGI basiert. Eine seiner Kernfunktionen ist es, auf HTTP -Anfragen zu hören und weiterzumachen ...

Wie erstelle ich dynamisch ein Objekt über eine Zeichenfolge und rufe seine Methoden in Python auf? Wie erstelle ich dynamisch ein Objekt über eine Zeichenfolge und rufe seine Methoden in Python auf? Apr 01, 2025 pm 11:18 PM

Wie erstellt in Python ein Objekt dynamisch über eine Zeichenfolge und ruft seine Methoden auf? Dies ist eine häufige Programmieranforderung, insbesondere wenn sie konfiguriert oder ausgeführt werden muss ...

Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Apr 02, 2025 am 06:36 AM

Verwenden Sie Python im Linux -Terminal ...

See all articles