因为项目需要,所以学习了一下如何使用C/C++调用python2/python3。先记录如下:
现在主流是使用python3,所以这里主要叙述如何调用python3,并且我会将调用python2的命令同样放在这里。
首先我们来看C++代码:
//main.cpp
#include "Python.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
Py_Initialize();/* 开始Python解释器 */
char* result;
PyRun_SimpleString("import sys");
PyRun_SimpleString("import BO");
PyObject* myModule = PyImport_ImportModule("BO");
PyObject* myFunction = PyObject_GetAttrString(myModule, (char*)"a");
PyObject* myResult = PyEval_CallObject(myFunction, NULL);
PyArg_Parse(myResult, "s", &result);
cout << "OK " << result[0] << endl;
Py_Finalize(); /* 结束Python解释器,释放资源 */
return 0;
亲测有效,简单来说开始的时候初始化Py_Initialize()
,并且调用PyRun_SimpleString
引入相应的包,下面是重点,我们这里的目的其实是让C代码能获取到Python的输出,所以这里的重点是调用与执行。
我们的python代码命名为BO.py,所以PyObject* myModule = PyImport_ImportModule("BO");
这句话的作用是引入这个python文件。
之后我们在该文件中加入a函数,如下:
BO.py
def a():
ret = '!'
return ret
并使用PyObject* myFunction = PyObject_GetAttrString(myModule, (char*)"a");
将该函数传给C++代码。
最重要的一点是我们需要通过PyArg_Parse(myResult, "s", &result);
函数将python传来的ret解析为result中,并且打印出来。
成功打印了OK !。
其中编译命令g++ call_function.cpp -I/usr/include/python3.6 -lpython3.6
对于python2使用 g++ call_function.cpp -I/usr/include/python2.7 -lpython2.7
我这里是3.6的python,所以需要用户按照自己的系统配置来修改对应的包版本。
针对输出的数据如何将python格式转换为c格式,我们引用:https://blog.csdn.net/zl_cd/article/details/18216915
有点像printf,比如我们想打印两个int,则使用:PyArg_Parse(myResult, "(ii)", &grid, &block);。这里有个()不知道为啥。具体的各种格式可以看上面的链接。
网友评论