c++调用python详解(多输入多输出)
2017-03-13 16:30
295 查看
Linux 下 c++调用python程序示例,python函数的输入输出皆为数组形式
环境 Ubuntu python2.7 c++11
自己整理的代码,希望大家也能参考使用到
c++程序如下 mycpp.cpp:
Python 程序如下 mypy.py:
运行结果:
环境 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# |
相关文章推荐
- Python调用C/C++动态链接库的方法详解
- Python调用C/C++动态链接库的方法详解
- Python调用C++程序的方法详解
- python调用外部子进程,通过管道实现异步标准输入和输出的交互
- Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕获sys.exit()调用
- Python调用C/C++动态链接库的方法详解
- Python语法基础_控制语句_输入输出语句详解
- 简明python教程 --C++程序员的视角(六):输入输出IO
- python调用外部子进程,通过管道实现异步标准输入和输出的交互
- 详解python如何调用C/C++底层库与互相传值
- C#调用C++ 平台调用P/Invoke 结构体--输入输出参数、返回值、返出值、结构体数组作为参数【五】
- Python调用C/C++动态链接库的方法详解
- C++调用Python基础功能实例详解
- 详解python如何调用C/C++底层库与互相传值
- 简明python教程 --C++程序员的视角(六):输入输出IO
- C#调用存储过程详解(带返回值、参数输入输出等)
- python调用外部子进程,通过管道实现异步标准输入和输出
- python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
- python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
- 简明python教程 --C++程序员的视角(六):输入输出