下面c_python_utils.h是处理工具函数,test.cpp是测试程序,hello.py是python类
可是当我集成到项目中的时候,PyImport_Import总是返回为空,起初我以为是init()中设置目录的问题,但是目录设置的是当前目录,hello.py也放在当前目录。
然而,然后让我发现项目是部署在服务器上的,而服务器上可执行文件在某个目录内,这个目录下根本就没有hello.py(因为我没有放进去)
所以,根本就在当前目录下找不到,就是这个小小的问题,都把我折腾了好久,现在想起来真是心伤啊。不过还是解决了。
/*************************************************************************************************** c_python_utils.h C++ Network Library, Copyright (c) Datatom Software, Inc.(2015) Author: liu.pan (liu.pan@datatom.com) Creating Time: 2015-5-4 ***************************************************************************************************/ #ifndef _DTCORE_C_PYTHON_UTILS_H_ #define _DTCORE_C_PYTHON_UTILS_H_ #include <Python.h> #include <stdio.h> #ifdef __cplusplus extern "C" { #endif /* C++ */ /** * 调用python类中的成员函数 * @param module python脚本名称,不含扩展 * @param class_name python类名称 * @param function python类成员函数 * @param format python类函数参数格式 * @return 返回字符串 */ char* py_call( const char* module, const char* class_name, char* function, char* format, ... ) { PyObject* pName = NULL; PyObject* pMod = NULL; PyObject* pDict = NULL; PyObject* pClass = NULL; PyObject* pInstance = NULL; PyObject* pParam = NULL; PyObject* pResult = NULL; // 导入模块 pName = PyString_FromString(module); pMod = PyImport_Import(pName); if( !pMod ) { return ""; } // 获取模块字典属性 pDict = PyModule_GetDict(pMod); if ( !pDict ) { return ""; } // 通过字典获取模块中的类 pClass = PyDict_GetItemString(pDict, class_name); if ( !pClass ) { return ""; } pInstance = PyInstance_New(pClass, NULL, NULL); if ( !pInstance ) { return ""; } pResult = PyObject_CallMethod(pInstance, function, format); char *rlt_ch = NULL; PyArg_Parse( pResult, "s", &rlt_ch ); return rlt_ch; } /** * 一些环境的初始化 * */ void init() { Py_Initialize(); PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); } /** * 逆初始化 */ void finit() { Py_Finalize(); } #ifdef __cplusplus } /* extern "C" */ #endif /* C++ */ #endif //_DTCORE_C_PYTHON_UTILS_H_
// test.cpp #include "c_python_utils.h" #include <stdio.h> int main(int argc, char const *argv[]) { init(); char* rlt_char = py_call("hello", "power", "liupan", "()"); finit(); printf("%s\n", rlt_char); return 0; }
# hello.py class power(): def liupan(self): return "hello world"
总结
所以,如果PyImport_Import总是返回为空,一定是查询目录的问题,要么目录设置错误,要么python代码根本没有在这个目录内。
因为C调用python是运行时执行的,而不是编译时链接的。