-
system()”函数启动python解释器,外部执行python脚本
a. 优点:简单实用
b. 缺点:
i. 需安装python环境,并设置好环境变量
ii. c++与python不能直接交互,只能通过读写文件作为中介交换信息 -
将python解释器嵌入C++程序中,直接执行嵌入的python代码
a. 优点:c++与python可直接交互
b. 缺点:较为复杂
方法一system()
一. 方法一 system()
- 需要调用的python程序helloworld.py
import sys
def printHello():
print(sys.version)
print("hello world!")
if __name__ == '__main__':
printHello()
- c++程序test2.cpp
#include<iostream>
int main(int argc, char *argv[])
{
std::cout << "-------- Python application begin --------\n" << std::endl;
system("python3 ../helloword.py");
std::cout << "\n-------- Python application end --------\n" << std::endl;
return 0;
}
- CmakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(python_test)
include_directories(
/usr/include/python2.7
)
add_executable(test1
test1.cpp)
add_executable(test2
test2.cpp)
target_link_libraries(test1
/usr/lib/x86_64-linux-gnu/libpython2.7.so
)
二. 方法二 Py_Initialize
-
步骤
a. 初始化Python调用环境
i. 调用Py_Initialize 函数来初始化Python环境
ii. 调用Py_IsInitialized来检测Python环境是否初始化成功
b. 加载对应的Python模块
c. 加载对应的Python函数
d. 将参数转化为Python元组类型
e. 调用Python函数并传入参数元组
f. 获取返回值
g. 根据Python函数的定义解析返回值 -
c++程序test1.cpp
#include <Python.h>
int main(int argc, char *argv[]) {
Py_Initialize(); //初始化
//判断初始化是否成功
if(!Py_IsInitialized())
{
printf("Python init failed!\n");
return -1;
}
//引入当前路径,否则下面模块不能正常导入
PyRun_SimpleString("import sys");
//PyRun_SimpleString("sys.path.append('./')");//若python文件在c++工程下
// 添加python文件所在的位置
PyRun_SimpleString("sys.path.append('/home/fg/project/sz')");
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
//导入python文件
pModule = PyImport_ImportModule("helloword");
if (!pModule) {
printf("Can not open python file!\n");
return -1;
}
//调用函数
pFunc = PyObject_GetAttrString(pModule, "printHello");
//PyEval_CallObject(pFunc, NULL);
PyObject_CallObject(pFunc, NULL);
Py_DECREF(pFunc);
Py_DECREF(pModule);
Py_Finalize();
return 0;
}