解决方案:c调用python,PyImport_Import或者PyImport_ImportModule总是返回为空
2015-05-07 16:04
2903 查看
下面c_python_utils.h是处理工具函数,test.cpp是测试程序,hello.py是python类
可是当我集成到项目中的时候,PyImport_Import总是返回为空,起初我以为是init()中设置目录的问题,但是目录设置的是当前目录,hello.py也放在当前目录。
然而,然后让我发现项目是部署在服务器上的,而服务器上可执行文件在某个目录内,这个目录下根本就没有hello.py(因为我没有放进去)
所以,根本就在当前目录下找不到,就是这个小小的问题,都把我折腾了好久,现在想起来真是心伤啊。不过还是解决了。
因为C调用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是运行时执行的,而不是编译时链接的。
相关文章推荐
- Python PyImport_ImportModule() 或者 PyImport_Import()失败问题
- Python PyImport_ImportModule() 或者 PyImport_Import()失败问题
- python加载模块PyImport_ImportModule返回NULL
- python import filename.py 及调用类的实例
- c++加载python模块,但是PyImport_ImportModule老返回NULL
- pywintypes.com_error: (-2147352567, '发生意外 解决方案 :出现在Python调用WPS中
- 在C/C++中嵌入python, 用PyImport_ImportModule返回值总是为0的解决方法
- c++加载python模块,但是PyImport_ImportModule老返回NULL
- 整合Spring后,调用Action总是返回Input解决方案
- c++加载python模块,但是PyImport_ImportModule老返回NULL
- 循环调用PyImport_ImportModule,写入异常
- python调用c++ ctype list传数组 或者 返回数组
- [VS2013]C++中调用Python脚本提示 error LNK2001: 无法解析的外部符号__imp_PyString_FromString等错误的解决方案
- ThinkPHP调用存储过程不能返回结果集的解决方案
- 【python】如何在某.py文件中调用其他.py内的函数
- Response.End,Resonse.Rediect,Server.transfer执行后会报异常(由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值)的问题解决方案
- Chrome总是自动缓存nginx返回的js文件的解决方案
- 第二次调用LocalActivityManager startActivity返回null解决方案
- Android使用系统调用相册的时候打开了云相册出现CRASH或者找不到截图程序的解决方案
- EntityFramework4的POCO模板生成FunctionImport返回空的服务端调用代码