美文网首页
用C调用python函数简易教程

用C调用python函数简易教程

作者: CPinging | 来源:发表于2020-08-04 17:15 被阅读0次

    因为项目需要,所以学习了一下如何使用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);。这里有个()不知道为啥。具体的各种格式可以看上面的链接。

    相关文章

      网友评论

          本文标题:用C调用python函数简易教程

          本文链接:https://www.haomeiwen.com/subject/jrbwrktx.html