Python C API-重新加载模块
Python C API - Reload a module
我使用Python 3.4和Visual 2010。我使用C API嵌入Python,为用户提供一些处理数据的脚本功能。我从C++代码中调用用户定义的python函数。例如,我调用用户必须在Python文件中定义的特定函数,如Apply()。假设用户有一个文件test.py,他在其中定义了一个处理一些数据的函数Apply()。我所要做的就是导入他的模块,并从C++中获得一个指向python函数的"指针"。
PySys_SetPath(file_info.absolutePath().toUtf8().data()));
m_module = PyImport_ImportModule(module_name.toUtf8().data());
if (m_module)
{
m_apply_function = PyObject_GetAttrString(m_module, "Apply");
m_main_dict = PyModule_GetDict(m_module);
}
到目前为止,一切都很好。但是,如果用户修改了他的脚本,他的函数的新版本将被考虑在内。。我必须重新启动我的程序才能使它工作。。。我在某个地方读到,我需要重新加载模块并获取函数上的新指针,但PyImport_ReloadModule返回NULL并显示"Import error"。
// .... code ....
// Reload the module
m_module = PyImport_ReloadModule(m_module);
有什么想法吗?顺致敬意,Poukill
答案在我的第一篇文章的评论中找到(谢谢J.F Sebastian),PySys_SetPath
还必须包含PYTHONPATH。在我的情况下,这就是PyImport_ReloadModule
失败的原因。
QString sys_path = file_info.absolutePath() + ";" + "C:\Python34\Lib";
PySys_SetPath(UTF8ToWide(sys_path.toUtf8().data()));
m_module = PyImport_ReloadModule(m_module); // Ok !
相关文章:
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 如何在没有"路径"模块的情况下加载 cheerp-wasm 程序?
- 无法加载 QML 插件:无法保护模块,因为它从未注册过
- 如何在C++中获得预加载的模块名称
- 如果我想通过OpenCV dnn模块加载PyTorch的模型,我应该如何保存它
- 在FreesWitch中使用AWS C SDK加载模块时未定义的符号错误
- 在 Lua 中加载 C++ 模块时'Attempt to index a string value'错误
- 地址清理器和运行时加载动态库 ->(<未知模块>)
- 将所有模块加载到过程中,然后将其出口
- 保存和加载我的模块
- Visual Studio 在附加到进程时不会加载模块
- C# 无法加载 DLL(找不到模块结果:0x8007007E)
- 在模块加载/卸载时构造/破坏外部c++模块中的对象
- LD_PRELOAD应该加载模块还是只使用模块来替换符号
- Python C API-重新加载模块
- DLL 无法加载:0x8007007E找不到模块。不确定导致此依赖项问题的原因
- 加载程序如何从动态模块分配/取消分配静态数据
- 模块"MyShellExt.dll"加载失败
- 为什么要在运行时加载模块?
- LoopPass可加载模块的未定义符号