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

步骤

  • 包含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
  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值