亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入淺析 C++ 調用 Python 模塊

2020-05-23 14:06:45
字體:
來源:轉載
供稿:網友
Python 提供了 C++ 庫,使得開發者能很方便地從 C++ 程序中調用 Python 模塊。接下來通過本文給大家介紹 C++ 調用 Python 模塊的相關知識,需要的朋友參考下吧
 

一般開發過游戲的都知道Lua和C++可以很好的結合在一起,取長補短,把Lua腳本當成類似動態鏈接庫來使用,很好的利用了腳本開發的靈活性。而作為一門流行的通用型腳本語言Python,也是可以做到的。在一個C++應用程序中,我們可以用一組插件來實現一些具有統一接口的功能,一般插件都是使用動態鏈接庫實現,如果插件的變化比較頻繁,我們可以使用Python來代替動態鏈接庫形式的插件(堪稱文本形式的動態鏈接庫),這樣可以方便地根據需求的變化改寫腳本代碼,而不是必須重新編譯鏈接二進制的動態鏈接庫。靈活性大大的提高了。

作為一種膠水語言,Python 能夠很容易地調用 C 、 C++ 等語言,也能夠通過其他語言調用 Python 的模塊。

Python 提供了 C++ 庫,使得開發者能很方便地從 C++ 程序中調用 Python 模塊。

具體的文檔參考官方指南:

Embedding Python in Another Application

調用方法

1 鏈接到 Python 調用庫

Python 安裝目錄下已經包含頭文件( include 目錄)和庫文件 ( Windows 下為 python27.lib)。

使用之前需要鏈接到此庫。

2 直接調用 Python 語句

<code class="language-cpp hljs ">#include "python/Python.h"int main(){Py_Initialize(); ## 初始化PyRun_SimpleString("print 'hello'");Py_Finalize(); ## 釋放資源}</code>

3 加載 Python 模塊并調用函數

~/test 目錄下含有 test.py :

<code class="language-python hljs ">def test_add(a, b):print 'add ', a, ' and ', breturn a+b</code>

則可以通過以下代碼調用 test_add 函數 :

<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'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); // 參數一設為4PyObject* arg2 = PyInt_FromLong(3); // 參數二設為3PyTuple_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>

參數傳遞

1 C++ 向 Python 傳遞參數

Python 的參數實際上是元組,因此傳參實際上就是構造一個合適的元組。

常用的有兩種方法:

使用 PyTuple_New 創建元組, PyTuple_SetItem 設置元組值

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

直接使用Py_BuildValue構造元組

<code class="language-cpp hljs ">PyObject* args = Py_BuildValue("ifs", 100, 3.14, "hello");PyObject* args = Py_BuildValue("()"); // 無參函數</code>

i, s, f之類的格式字符串可以參考 格式字符串

2 轉換 Python 返回值

調用 Python 得到的都是PyObject對象,因此需要使用 Python 提供的庫里面的一些函數將返回值轉換為 C++ , 例如 PyInt_AsLong,PyFloat_AsDouble, PyString_AsString 等。

還可以使用 PyArg_ParseTuple 函數來將返回值作為元組解析。

PyArg_Parse 也是一個使用很方便的轉換函數。

PyArg_ParseTuple 和 PyArg_Parse 都使用 格式字符串

注意事項

需要將 Python 的工作目錄切換到模塊所在路徑 按照模塊名加載而不是文件名 模塊加載或者函數加載需要驗證是否成功,否則可能會引起堆棧錯誤導致程序崩潰 需要使用 Py_DECREF(PyObject*) 來解除對象的引用(以便Python垃圾回收)

以上所述是小編給大家介紹的C++ 調用 Python 模塊的相關知識,希望對大家有所幫助!



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品综合精品自拍| 欧美国产精品va在线观看| 日韩av在线免费观看一区| 精品成人av一区| 亚洲精品狠狠操| 亚洲国产成人精品久久| 日韩中文字幕国产| 国产精品久久久亚洲| 欧美精品久久久久久久久| 久久久久久久影视| 亚洲精品中文字幕有码专区| 日本a级片电影一区二区| 黄网动漫久久久| 亚洲国产精品热久久| 亚洲乱亚洲乱妇无码| 国产精品第七影院| 国产区精品视频| 国产a∨精品一区二区三区不卡| 国产小视频国产精品| 亚洲激情第一页| 欧美视频不卡中文| 6080yy精品一区二区三区| 亚洲精品久久久久久久久| 琪琪第一精品导航| 国产欧美日韩专区发布| 成人网在线观看| 亚洲最大福利网| 国产精品久久久久久久天堂| 福利一区福利二区微拍刺激| 国产精品福利在线观看| 国产一区欧美二区三区| 91在线免费看网站| 日韩最新av在线| 欧美精品在线极品| 欧美黑人一区二区三区| 高清一区二区三区四区五区| 九九久久综合网站| 美女视频久久黄| 91免费视频网站| 亚洲欧美日本另类| 91久久精品日日躁夜夜躁国产| 一本一本久久a久久精品综合小说| 日韩精品视频中文在线观看| 亚洲一区二区三区xxx视频| 日韩欧美在线播放| 国产精品精品视频一区二区三区| 国产日韩中文字幕在线| 大胆人体色综合| 国产精品一区久久| 亚洲国产精品久久久| 日韩欧美在线视频| 亚洲日本成人女熟在线观看| 一个人www欧美| 国产成人在线视频| 国产精品久久久久av免费| 亚洲美女福利视频网站| 日本不卡免费高清视频| 精品偷拍各种wc美女嘘嘘| 4k岛国日韩精品**专区| 久久夜色精品国产欧美乱| 一区二区福利视频| 成人h视频在线观看播放| 亚洲电影免费在线观看| 国产精品r级在线| 亚洲电影免费观看| 91精品国产自产91精品| 久久中文字幕在线| 国产成人久久精品| 国内精品美女av在线播放| 国产视频精品xxxx| 亚洲国产成人爱av在线播放| 精品亚洲一区二区三区在线播放| 欧美精品在线免费播放| 夜夜嗨av色一区二区不卡| 日韩中文在线中文网在线观看| 亚洲日韩欧美视频| 国产精品高潮呻吟久久av黑人| 亚洲国产成人爱av在线播放| 在线播放日韩欧美| 中文字幕在线视频日韩| 亚洲午夜性刺激影院| 精品亚洲va在线va天堂资源站| 中文字幕在线观看日韩| 精品国产乱码久久久久久婷婷| 中文字幕亚洲欧美日韩2019| 日本亚洲精品在线观看| 久久久精品视频在线观看| 国外成人在线视频| 亚洲国产精品va在线观看黑人| 国产成人一区二区三区电影| 国产区精品在线观看| 一区二区欧美激情| 午夜精品视频网站| 国产精品亚洲欧美导航| 中文字幕久久精品| 欧美日韩人人澡狠狠躁视频| 91精品国产成人www| 啪一啪鲁一鲁2019在线视频| 色妞欧美日韩在线| 欧美激情一级欧美精品| 亚洲欧美制服第一页| 992tv成人免费影院| 亚洲的天堂在线中文字幕| 国产亚洲福利一区| 久久精品视频中文字幕| 一区国产精品视频| 日韩在线视频中文字幕| 国产一区av在线| 日韩女优在线播放| 欧美一区二区视频97| 亚洲国产精品久久久久秋霞蜜臀| 最近更新的2019中文字幕| 亚洲第一免费播放区| 丝袜一区二区三区| 国产91精品久久久久| 欧美性猛交xxxx乱大交蜜桃| 欧美成人免费播放| 欧美大片在线影院| 久久久999精品视频| 日韩成人在线视频| 久久99精品久久久久久噜噜| 欧美性生交大片免网| 精品国产拍在线观看| 亚洲理论片在线观看| 亚洲精品一区二区在线| 久久久精品网站| 久久视频中文字幕| 国产精品久久久久久av福利软件| 久久av在线看| 国产亚洲精品高潮| 欧美激情喷水视频| 欧美激情按摩在线| 亚洲第一精品夜夜躁人人爽| 久久久国产影院| 麻豆精品精华液| 中文在线不卡视频| 91九色国产视频| 亚洲精品色婷婷福利天堂| 国产亚洲精品一区二555| 91中文在线观看| 国产福利精品视频| 日韩中文字幕免费| 亚洲欧美激情另类校园| 日韩日本欧美亚洲| 亚洲精品欧美日韩| 青青草原一区二区| 亚洲日本中文字幕免费在线不卡| 欧美国产一区二区三区| 欧洲日本亚洲国产区| 国产99久久精品一区二区 夜夜躁日日躁| 成人网在线免费观看| 久久久精品网站| 乱亲女秽乱长久久久| 久久在线免费观看视频| 国产精品草莓在线免费观看| 国产成人精品久久久| 91在线视频导航| 精品久久久久久久久久ntr影视| 国产欧美精品一区二区三区介绍| 久久久国产精品x99av| 欧美xxxx18国产| 国产精品都在这里| 久久影院资源网| 久久精品美女视频网站|