本文中c++與python通過列表list傳遞數值,python代碼如下:
def makelist():
list_a =[1,23,34,46,34.3345,34]
list_b =[1,2,3]
list_c =[45,5,3]
return list_a,list_b+list_c
# #返回的是元胞
def readlist(list1):
print(str(list1[1])+'-->來自c++賦值')
if __name__ =='__main__':
readlist([1,2,3])
if name ==‘main’:爲該腳本的入口,makelist()函數以元胞()的形式輸出兩個列表[],供c++提取,readlist()以元胞()的形式輸入一個列表[],該列表數據由c++輸入,上述腳本運行結果如下:
c++端:
控制檯程序,配置如下,添加pyhon頭文件及動態庫,pyhton爲64位,c++程序爲release x64,運行該程序需要將python放入c++可執行文件目錄下
代碼如下:
#include <iostream>
#include <Python.h>
using namespace std;
int main()
{
// 初始化Python環境
Py_Initialize();
// 判斷初始化是否成功
if (!Py_IsInitialized())
{
cout << "Initialize failed ..." << endl;
// 關閉 Python 腳本解釋器,釋放內存。
Py_Finalize();
return -1;
}
// 添加模塊路徑
PyRun_SimpleString("import sys");
//設置python文件存放的文件夾
PyRun_SimpleString("sys.path.append('./')");
PyObject *pModule = NULL;
PyObject * pFun_makelist = NULL; //函數名1
PyObject * pFun_readlist = NULL; //函數名2
// 導入模塊,加載py文件
pModule = PyImport_ImportModule("DemoForCpp");
if (!pModule) // 檢查模塊是否導入成功
{
cout << "Python file import failed ..." << endl;
Py_Finalize();
return -1;
}
// 導入函數
pFun_makelist = PyObject_GetAttrString(pModule, "makelist"); //python 腳本里的函數名
if (!pFun_makelist) // 檢查函數是否導入成功
{
cout << "Function import failed ..." << endl;
Py_Finalize();
return -1;
}
PyObject *pArgs = nullptr;//輸入參數
PyObject *pReturn = PyEval_CallObject(pFun_makelist, 0);//含返回參數的
PyObject *plist1 = nullptr, *plist2 = nullptr; //返回的是兩個列表
if (pReturn&&PyTuple_Check(pReturn))
{ //檢查是否爲List對象
plist1 = PyTuple_GetItem(pReturn, 0);
plist2 = PyTuple_GetItem(pReturn, 1);
//PyList_GetItem(plist1, 0)表示獲取列表中1號元素
PyObject *ListItem = PyList_GetItem(plist2, 1);
int nResult = 0;
//'i'對應int ,'d'對應double
PyArg_Parse(ListItem, "i", &nResult);
cout << nResult << " --> 來自python makelist函數\n"; //輸出元素
}
else
{
cout << "Not a turple" << endl;
}
pFun_readlist = PyObject_GetAttrString(pModule, "readlist"); //python 腳本里的函數名
if (!pFun_readlist) // 檢查函數是否導入成功
{
cout << "Function import failed ..." << endl;
Py_Finalize();
return -1;
}
//輸入也是以元胞輸入
pArgs = PyTuple_New(1);
PyObject *pListNew = PyList_New(3);
PyList_SetItem(pListNew, 0, Py_BuildValue("i", 99));
PyList_SetItem(pListNew, 1, Py_BuildValue("i", 89));
PyList_SetItem(pListNew, 2, Py_BuildValue("i", 79));
//元胞0號位是plist1
PyTuple_SetItem(pArgs, 0, pListNew);
PyEval_CallObject(pFun_readlist, pArgs);
// 釋放new reference的對象
Py_DECREF(pArgs);
Py_DECREF(pReturn);
Py_DECREF(pListNew);
Py_DECREF(plist1);
Py_DECREF(plist2);
Py_DECREF(pFun_makelist);
Py_DECREF(pFun_readlist);
Py_DECREF(pModule);
Py_Finalize();
return 0;
}
運行後結果如下,其中,第一句爲c++獲取python列表的元素,第二句爲python打印c++數值,即python腳本能與c++程序互相傳值