下面c_python_utils.h是处理工具函数,test.cpp是测试程序,hello.py是python类
可是当我集成到项目中的时候,PyImport_Import总是返回为空,起初我以为是init()中设置目录的问题,但是目录设置的是当前目录,hello.py也放在当前目录。
然而,然后让我发现项目是部署在服务器上的,而服务器上可执行文件在某个目录内,这个目录下根本就没有hello.py(因为我没有放进去)
所以,根本就在当前目录下找不到,就是这个小小的问题,都把我折腾了好久,现在想起来真是心伤啊。不过还是解决了。
/*************************************************************************************************** c_python_utils.hC++ 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是运行时执行的,而不是编译时链接的。