2023年7月26日发(作者:)
C++调⽤Python函数并传⼊传出参数步骤包含Python.h,引⼊_Initialize()初始化,结束时调⽤Py_Finalize()导⼊sys模块,添加python脚本路径导⼊脚本⽂件,从脚本中导⼊函数模块构造⼊参,如果有三个参数就构造PyTuple_New(3)构造每⼀个参数,可以是C++的基本类型,也可以是Python的List类型将所有参数加⼊到Tuple之中函数调⽤,得到返回值直接解析C++基本类型的返回值或者使⽤PyList_GetItem等函数解析嵌套的返回值C++代码#include "Python.h"//import //初始化Py_Initialize();if ( Py_IsInitialized() ){ //导⼊sys模块 PyRun_SimpleString("import sys"); PyRun_SimpleString("('./pyScript')");}
//导⼊脚本内的函数PyObject* pModule = PyImport_ImportModule("delaunay");PyObject* pFunSetSeedPoint= PyObject_GetAttrString(pModule,"setSeedPoint");//定义⼊参和出参PyObject* args = PyTuple_New(2);PyObject* pReturnValue;
//两个⼊参分别为 x,y coordinate of each pointPyObject* pyListX = PyList_New(length);PyObject* pyListY = PyList_New(length);for(int i=0; i PyList_SetItem(pyListY, i, PyFloat_FromDouble( seedPoint[i].y() ));}//构建参数tuplePyTuple_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 : setSeedCenter(x, y): global seedCenter #调整numpy数组⼤⼩ count = len(x) seedPoint = (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)): (seedPoint[i][0]) (seedPoint[i][1]) (xx) (yy) return result
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690306320a329697.html
评论列表(0条)