C++调用Python
C++调用python模块是属于混合编程的问题。本文主要讲解的内容为:1、在Ubuntu中搭建实现编译环境,2、Clion中实现C++ 调用Python模块。
1、搭建编译环境
- 实验环境:Ubuntu16.04 + Python2.7 + Clion
- 搭建步骤
- Ubuntu系统本身自带python2.7,但是版本可能稍微比较老,现在python2.7最新版本到了python2.7.14,安装步骤网上教程一堆,可以自行搜索实现
- 安装Clion软件,新建一个C++项目
- 项目文件建好后,打开项目中的CmakeList.txt文件,添加Python.h头文件路径和lib路径,比如我的CmakeList中内容为:
cmake_minimum_required(VERSION 3.6)
project(UarmFirst)
set(CMAKE_CXX_STANDARD 11)
# 添加Python.h头文件路径
include_directories(/usr/include/python2.7)
# 添加python动态链接库文件目录
link_directories(/usr/lib/python2.7/config-x86_64- linux-gnu)
set(SOURCE_FILES main.cpp)
add_executable(UarmFirst ${SOURCE_FILES})
# 依赖库文件
target_link_libraries(UarmFirst libpython2.7.so)
因为是在Ubuntu系统上实现,所以在Clion运行之前你还需要在Clion上设置环境变量,具体步骤如下:
1、点击Clion左上角如下图2、点击EditConfigurations...按钮,弹出如下图
3、在上图红色圈住的地方配置环境变量,点击红色地方最右边的三个点按钮,弹出如下图
4、点击左上角的 ** + ** 按钮,添加Name和Value,如上图,Name:PYTHONPATH,Value:.:$PYTHONPATH。填写完,依次点击 ok -> apply -> ok 按钮,关闭弹出的两个窗口。
到此位置,在Clion中实现C++调用python模块的环境已经配置完毕,下面就可以编写代码实现了。
2、Clion中进行C++调用Python模块
首先你需要在cpp文件开头引入Python.h头文件,由于Python可能会定义一些影响某些系统上的标准头的预处理器定义,因此您必须在包含任何标准头之前包含Python.h。
下面演示一个比较简单的例子,实现了执行一句Python的输出语句print 'Hello Python!'
具体代码如下:
#include <Python.h>
int main(int argc, char *argv[])
{
# 初始化python解释器
Py_Initialize();
# 执行python语句
PyRun_SimpleString("print 'Hello Python!'\n");
# 撤销Py_Initialize()和随后使用Python/C API函数进行的所有初始化,
#并销毁自上次调用Py_Initialize()以来创建并为被销毁的所有子解释器。
Py_Finalize();
return 0;
}
当然你也可以在Clion项目的** cmake-build-debug ** 文件夹下新建一个Python文件,将Python代码全部写在该Python文件上,然后在Clion项目的cpp文件中调用该Python文件内的Python函数。
首先贴出我的Clion演示项目的结构图
图中红色矩形标注为我的Python文件,具体内容为:
def great_function(a):
return a + 1
即实现了一个简单功能的Python函数,
我在main.cpp文件中的代码如下:
#include <Python.h>
int great_function_from_python(int a);
int main() {
Py_Initialize();
printf("%d", great_function_from_python(2));
Py_Finalize();
}
int great_function_from_python(int a) {
int res;
PyObject *pModule, *pFunc;
PyObject *pArgs, *pValue;
/* import */
pModule = PyImport_Import(PyString_FromString("great_module"));
/* great_module.great_function */
pFunc = PyObject_GetAttrString(pModule, "great_function");
/* build args */
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, PyInt_FromLong(a));
/* call */
pValue = PyObject_CallObject(pFunc, pArgs);
res = PyInt_AsLong(pValue);
return res;
}
注意:此时great_function_from_python(int a)
函数中的某些变量或者函数名可能会变红,鼠标移动上面,提示无法解析该变量或函数,如下图:
主要原因是因为你在引用Python.h头文件时写的是include<Python.h>
,但是你的Ubuntu可能安装了python3.5和python2.7两个版本,将头文件引用换为include<python2.7/Python.h>
就可以消除变量和函数名变红的现象。虽然变量和函数变红也不影响程序的运行,但总是看着不舒服。
总结
在Clion软件中调用Python模块,我调试了大约一个星期的时间,弄得心烦意乱,每一次的尝试都是痛苦的,但是不得不说,每一次尝试过后我都涨了一点这方面的知识和经验,最终将问题成功解决,我收获最多的可能不是这个问题解决了,而是解决这个问题的过程中我坚持下来了,并且为我以后的编程之路打下基础。
最后
至于具体cpp中调用Python模块的函数的具体意思请自行百度,推荐两个学习的网址:一个是知乎上的,一个官方提供的Python/C API文档。建议先看知乎上的那一篇,个人感觉相当不错,比网络其他博客写的靠谱多了,看完后可以再看官方提供的API文档。
注 :本文是参考知乎上的那一篇文章之后才配置成功的,写该篇文章时也有借鉴。