C++调用Python函数并传入传出参数

xiaoxiao2021-02-28  26

步骤

包含Python.h,引入python.lib Py_Initialize()初始化,结束时调用Py_Finalize()导入sys模块,添加python脚本路径导入脚本文件,从脚本中导入函数模块构造入参,如果有三个参数就构造PyTuple_New(3)构造每一个参数,可以是C++的基本类型,也可以是Python的List类型将所有参数加入到Tuple之中函数调用,得到返回值直接解析C++基本类型的返回值或者使用PyList_GetItem等函数解析嵌套的返回值

C++代码

#include "Python.h" //import python36.lib //初始化 Py_Initialize(); if ( Py_IsInitialized() ) { //导入sys模块 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./pyScript')"); } //导入脚本内的函数 PyObject* pModule = PyImport_ImportModule("delaunay"); PyObject* pFunSetSeedPoint= PyObject_GetAttrString(pModule,"setSeedPoint"); //定义入参和出参 PyObject* args = PyTuple_New(2); PyObject* pReturnValue; //两个入参分别为 x,y coordinate of each point PyObject* pyListX = PyList_New(length); PyObject* pyListY = PyList_New(length); for(int i=0; i<length; i++) { PyList_SetItem(pyListX, i, PyFloat_FromDouble( seedPoint[i].x() )); PyList_SetItem(pyListY, i, PyFloat_FromDouble( seedPoint[i].y() )); } //构建参数tuple PyTuple_SetItem(args, 0, pyListX); PyTuple_SetItem(args, 1, pyListY); //调用函数,得到返回值 if (pModule && pFunSetSeedPoint) { pReturnValue = PyObject_CallObject(pFunSetSeedPoint, args); //检查是否为List对象 if(PyList_Check(pReturnValue )) { int SizeOfList = PyList_Size(pReturnValue );//List对象的大小,这里SizeOfList = 3 for(int i = 0; i < SizeOfList; i++) { PyObject *ListItem = PyList_GetItem(pReturnValue, i);//获取List对象中的每一个元素 int NumOfItems = PyList_Size(ListItem);//List对象子元素的大小 for(int Index_k = 0; Index_k < NumOfItems; Index_k++) { PyObject *Item = PyList_GetItem(ListItem, Index_k);//遍历List对象中子元素中的每个元素 qDebug() << PyFloat_AsDouble(Item) <<"\n "; //输出元素 Py_DECREF(Item); //释放空间 } Py_DECREF(ListItem); //释放空间 } } else { qDebug()<<"something wrong when set seed center in python!"; } } Finalize();

Python 代码

# file name : delaunay.py def setSeedCenter(x, y): global seedCenter #调整numpy数组大小 count = len(x) seedPoint = np.resize(seedPoint, (count, 2)) #读取输入参数 for i in range(len(x)): seedPoint[i][0] = x[i] seedPoint[i][1] = y[i] #构造返回值 xx = [] yy = [] for i in range(len(seedPoint)): xx.append(seedPoint[i][0]) yy.append(seedPoint[i][1]) result.append(xx) result.append(yy) return result
转载请注明原文地址: https://www.6miu.com/read-2602646.html

最新回复(0)