c++调用python详解(多输入多输出)
·
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# |
更多推荐
所有评论(0)