C调用Python的示例代码

fext_tensorrt的代码如下:

def fext_call(arg1, arg2):
    print("fext_call()", arg1, arg2)
    return "fext_call"

C的代码如下,传递两个参数,获取并输出函数调用结果:

#include <Python.h>
 
int python_test()
{
    //初始化,载入python的扩展模块
    Py_Initialize();
    //判断初始化是否成功
    if(!Py_IsInitialized())
    {
        printf("Python init failed!\n");
        return -1;
    }
 
    //导入当前路径
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
 
    //对齐
    PyObject *pName   = NULL;
    PyObject *pModule = NULL;
    PyObject *pDict   = NULL;
    PyObject *pFunc   = NULL;
    PyObject *pArgs   = NULL;
 
    //加载名为py_add的python脚本
    pName = PyString_FromString("fext_tensorrt");
    pModule = PyImport_Import(pName);
    if (!pModule)
    {
        GH_LOG_INFO("Load py_add.py failed!");
        getchar();
        return -1;
    }
    
    pDict = PyModule_GetDict(pModule);
    if (!pDict)
    {
        GH_LOG_INFO("Can't find dict in py_add!");
        return -1;
    }
        
    pFunc = PyDict_GetItemString(pDict, "fext_call");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        GH_LOG_INFO("Can't find function!");
        return -1;
    }
 
    /*
    用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数
    */
    pArgs = PyTuple_New(2);
    
    //  PyObject* Py_BuildValue(char *format, ...) 
    //  把C++的变量转换成一个Python对象。当需要从 
    //  C++传递变量到Python时,就会使用这个函数。此函数 
    //  有点类似C的printf,但格式不同。常用的格式有 
    //  s 表示字符串, 
    //  i 表示整型变量, 如Py_BuildValue("ii",123,456)
    //  f 表示浮点数, 
    //  O 表示一个Python对象
 
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i",  123 ));
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", "789"));
 
    //调用python的add函数
    PyObject* pResult = PyObject_CallObject(pFunc,pArgs);
    GH_LOG_INFO("result=%s", PyString_AsString(pResult));
 
    //清理python对象
    if (pName)
    {
        Py_DECREF(pName);
    }
    if (pArgs)
    {
        Py_DECREF(pArgs);
    }
    if (pModule)
    {
        Py_DECREF(pModule);
    }
    
    //关闭python调用
    Py_Finalize();
 
    return 0;
    
}
上一篇:《鸟哥的Linux 私房菜 基础学习篇(第三版)》——0.3 数据表示方式


下一篇:【网站安全】网站被挂木马与777权限的奥妙