参考链接:https://blog.csdn.net/u012983289/article/details/55194714
Python脚本如下:
def printHelloWold():
print('hello world')
def add(a, b):
c = a+b
return c
C++代码如下:
#include <iostream>
#include "Python.h"
using namespace std;
// 简易版本
void method1()
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyRun_SimpleString("import pytest");
PyRun_SimpleString("pytest.printHelloWold()");
Py_Finalize();
}
// 初级版本
void method2()
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject *pModule = NULL;
PyObject *pFunc = NULL;
pModule = PyImport_ImportModule("pytest"); //Python文件名
pFunc = PyObject_GetAttrString(pModule, "printHelloWold"); //Python文件中的函数名
PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空
Py_Finalize(); //Py_Finalize,和Py_Initialize相对应的.
}
// 带参数和返回值版本
void method3()
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject *pModule = NULL;
PyObject *pFunc = NULL;
pModule = PyImport_ImportModule("pytest"); //Python文件名
pFunc = PyObject_GetAttrString(pModule, "add"); //Python文件中的函数名
//创建参数:
PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6)); //0--序号,i表示创建int型变量
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8)); //1--序号
//返回值
PyObject *pReturn = NULL;
pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数
//将返回值转换为int类型
int result;
PyArg_Parse(pReturn, "i", &result); //i表示转换成int型变量
cout << "6 + 8 = " << result << endl;
Py_Finalize();
}
int main()
{
// 简易版本
method1();
// 初级版本
method2();
// 带参数和返回值版本
method3();
return 0;
}
CMakeLists.txt内容如下:
cmake_minimum_required( VERSION 2.8 )
project ( code_test )
set( CMAKE_CXX_COMPILER "g++" )
set( CMAKE_BUILD_TYPE "Debug" )
set( CMAKE_CXX_FLAGS "-std=c++11 -O0" )
include_directories(
/usr/include/python3.6m
)
link_directories(
/usr/lib/x86_64-linux-gnu
)
add_executable( run_test test.cpp )
target_link_libraries(run_test
libpython3.6m.so
)
如果用gcc,则相当于:
g++ test.cpp -I /usr/include/python3.6m -L /usr/lib/x86_64-linux-gnu -lpython3.6m
输出如下:
hello world
hello world
6 + 8 = 14
说明程序编译运行成功。
我曾经尝试调用Anaconda的Python,但是经过各种尝试还是失败,所以暂且使用系统自带的Python吧。