C++调用Python函数并传入传出参数
2018-03-15 16:39
633 查看
步骤
包含Python.h,引入python.libPy_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
相关文章推荐
- Windows下QT中用C++调用Python之三 - 基础参数的传入和传出
- liunx python调用c++库(类、函数),传入传出参数
- c++函数在传入对象参数和返回对象时候的内存调用情况
- python嵌入C++------ boost.python如何在C++中调用含有不定长参数tuple变量和关键字参数dict变量的函数
- Python中将函数作为另一个函数的参数传入并调用
- C/C++学习之C提高----函数调用模型、指针做函数参数、字符串的基本操作、一级指针内存模型建立
- 函数调用约定(注意c++普通函数成员调用时有this参数)
- lua脚本语言的学习-----------------如何实现c++无参数的函数在lua中调用
- VS2008环境下C++调用Python模块函数----一封邮件引发的关机
- Python 函数的默认参数, 关键字参数的调用
- python调用c函数参数类型问题
- python 函数调用参数传递规则
- Python自定义函数的创建、调用和函数的参数详解 .argmax
- c# 调用 C++ dll 传入传出 字符串
- 函数调用时参数传入的几种情况
- C++调用Python函数
- tornado学习笔记(一):如何给ioloop.run_sync()中调用的函数传入参数
- python *args **kwargs,传入不固定的参数给函数,或者传入很多的内容给函数,常用在构造函数中。
- WebService中更新函数传入值,再调用其中函数时,函数的参数还是未改变
- C++ :函数中无需改变传入参数的值时,定义时把 “Item & x ” 都改成 \"const Item & x\"