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; }