最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年03月15日 13:46:51   投稿:mrr  
Python 提供了 C++ 庫,使得開發(fā)者能很方便地從 C++ 程序中調用 Python 模塊。接下來通過本文給大家介紹 C++ 調用 Python 模塊的相關知識,需要的朋友參考下吧

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

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

Python 提供了 C++ 庫,使得開發(fā)者能很方便地從 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 ', b
return 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); // 參數一設為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>

參數傳遞

1 C++ 向 Python 傳遞參數

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

常用的有兩種方法:

使用 PyTuple_New 創(chuàng)建元組, 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 模塊的相關知識,希望對大家有所幫助!

相關文章

  • C語言中組成不重復的三位數問題

    C語言中組成不重復的三位數問題

    這篇文章主要介紹了C語言中組成不重復的三位數問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • VC++6.0實現(xiàn)直線掃描轉換的圖文教程

    VC++6.0實現(xiàn)直線掃描轉換的圖文教程

    這篇文章主要給大家介紹了關于VC++6.0實現(xiàn)直線掃描轉換的相關資料,文中通過圖文將實現(xiàn)的步驟一步步介紹的非常詳細,對大家學習或者使用VC++6.0具有一定的參考學習價值,需要的朋友可以參考下
    2023-01-01
  • C語言二叉樹常見操作詳解【前序,中序,后序,層次遍歷及非遞歸查找,統(tǒng)計個數,比較,求深度】

    C語言二叉樹常見操作詳解【前序,中序,后序,層次遍歷及非遞歸查找,統(tǒng)計個數,比較,求深度】

    這篇文章主要介紹了C語言二叉樹常見操作,結合實例形式詳細分析了基于C語言的二叉樹前序,中序,后序,層次遍歷及非遞歸查找,統(tǒng)計個數,比較,求深度等相關操作技巧與注意事項,需要的朋友可以參考下
    2018-04-04
  • C++中指向結構體變量的指針

    C++中指向結構體變量的指針

    結構體變量的指針就是該變來那個所占據的內存段的起始地址。可以設一個指針變量,來指向一個結構體變量,此時該指針變量的值是結構體變量的起始地址
    2013-10-10
  • C++?基本數據類型中int、long等整數類型取值范圍及原理分析

    C++?基本數據類型中int、long等整數類型取值范圍及原理分析

    這篇文章主要介紹了C++?基本數據類型中int、long等整數類型取值范圍及原理分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++中設計一個類時的注意事項分享

    C++中設計一個類時的注意事項分享

    這篇文章主要來和大家分享一下C++中,設計一個類要注意哪些東西,這往往也是C++面試時會考到的問題,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • C語言實現(xiàn)簡單學生成績管理系統(tǒng)項目

    C語言實現(xiàn)簡單學生成績管理系統(tǒng)項目

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單學生成績管理系統(tǒng)項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++11?nullptr實現(xiàn)初始化空指針

    C++11?nullptr實現(xiàn)初始化空指針

    避免產生“野指針”最有效的方法,就是在定義指針的同時完成初始化操作,本文主要介紹了C++11?nullptr初始化空指針,感興趣的可以了解一下
    2022-01-01
  • C語言動態(tài)內存規(guī)劃詳解

    C語言動態(tài)內存規(guī)劃詳解

    這篇文章主要介紹了C語言動態(tài)內存的規(guī)劃,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-10-10
  • C語言實現(xiàn)經典排序算法的示例代碼

    C語言實現(xiàn)經典排序算法的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)經典排序算法中的冒泡排序、選擇排序、插入排序、希爾排序,文中的示例代碼講解詳細,需要的可以參考一下
    2022-08-08

最新評論

定结县| 农安县| 洱源县| 澳门| 仲巴县| 依安县| 嵊州市| 徐州市| 宿松县| 遵化市| 新巴尔虎左旗| 东方市| 贵港市| 蒙城县| 静海县| 通海县| 通城县| 新安县| 武邑县| 邵阳市| 林州市| 尉犁县| 浦江县| 广河县| 大庆市| 遂宁市| 平定县| 松溪县| 黄平县| 德安县| 措勤县| 徐水县| 二连浩特市| 康定县| 崇明县| 张家界市| 靖宇县| 通许县| 田东县| 普格县| 镇安县|