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

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

2017-03-13 16:30 295 查看
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的 import
pyModule = 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元素均为double
PyObject* 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,sys

def 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#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  混合编程 c++ python