c++调用python详解(多输入多输出)

来源:互联网 发布:淘宝卖家不给发票 编辑:程序博客网 时间:2024/06/05 19:09

Linux 下 c++调用python程序示例,python函数的输入输出皆为数组形式

环境 Ubuntu python2.7  c++11

自己整理的代码,希望大家也能参考使用到


c++程序如下 mycpp.cpp:

#include <Python.h>#include <iostream>#include <vector>int main(){PyObject* pyName;PyObject* pyModule;PyObject* pyDict;PyObject* pyFunc;PyObject* pyArgs;//初始化python解释器Py_Initialize();if (!Py_IsInitialized()) {return false;}//开始使用PyRun_SimpleString 运行python语句, 设置被调用的python脚本的全路径PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('./')");//导入python脚本文件testpy.py,此处的脚本文件名不需要加扩展名pyName = PyString_FromString("mypy");//加载python模型,作用类似python的 importpyModule = PyImport_Import(pyName); if (!pyModule) {printf("can't find mypy.py\n");return false;}//取得模块接口字典信息pyDict = PyModule_GetDict(pyModule);if (!pyDict) {return false;}//获取需要使用的接口句柄pyFunc = PyDict_GetItemString(pyDict, "doubleArray");if (!pyFunc || !PyCallable_Check(pyFunc)) {printf("can't find function [doubleArray]\n");return false;}//开始准备调用python函数, 接口的输入和输出均为size为5的Tuple类型, Tuple元素均为doublePyObject* pytuple = PyTuple_New(5);for (int i = 0; i < 5; ++i) {PyTuple_SetItem(pytuple, i, Py_BuildValue("d", (double)i));}pyArgs = PyTuple_New(1);PyTuple_SetItem(pyArgs, 0, pytuple);//调用接口,取得返回值PyObject* pyResult = PyObject_CallObject(pyFunc, pyArgs);//解析结果int size = PyList_Size(pyResult);std::vector<double> result;double tmp;for (int i = 0; i < size; ++i) {PyArg_Parse(PyList_GET_ITEM(pyResult, i), "d", &tmp);result.push_back(tmp);}//打印处理结果for (auto item : result) {std::cout << item << " ";}std::cout<<std::endl;//删除python object变量Py_DECREF(pyArgs);Py_DECREF(pyFunc);Py_DECREF(pyDict);Py_DECREF(pyModule);Py_DECREF(pyName);return 0;}

Python 程序如下 mypy.py:

import os,sysdef doubleArray(arr):    list_ = []    for item in arr:        list_.append(item*2)    return list_

运行结果:

cpp_call_python# g++ -std=c++11 mycpp.cpp -o mycpp.out -I/usr/include/python2.7/ -lpython2.7
cpp_call_python# ./mycpp.out
0 2 4 6 8
cpp_call_python#


0 0
原创粉丝点击