用C调用python函数简易教程

2020-08-04  本文已影响0人  CPinging

因为项目需要,所以学习了一下如何使用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中,并且打印出来。

image.png

成功打印了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);。这里有个()不知道为啥。具体的各种格式可以看上面的链接。

上一篇下一篇

猜你喜欢

热点阅读