您的位置:首页 > 编程语言 > C语言/C++

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

2018-03-15 16:39 633 查看

步骤

包含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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python c语言
相关文章推荐