c++與python通訊

本文中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++程序互相傳值
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章