fext_tensorrt的代码如下:
def fext_call(arg1, arg2):
print("fext_call()", arg1, arg2)
return "fext_call"
C的代码如下,传递两个参数,获取并输出函数调用结果:
#include
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;
}