python - python C API重新加载模块

  显示原文与译文双语对照的内容
0 0

我使用 python 3.4和可视化 2010. 我使用C API嵌入了 python,给用户一些脚本能力来处理他的数据。 我从 C++ 代码中调用由用户定义的python 函数。 我调用 Apply() 之类的特定函数,用户必须在 python 文件中定义。 假设用户有一个文件 test.py,其中定义了处理某些数据的function Apply() 。 我只需要导入 MODULE,从 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);
}

到目前为止,很好。但是如果用户修改脚本,新版本的函数将永远不会被考虑在内。 我得重启我的程序才能让它工作。 我读到了我需要重新加载 MODULE的地方,然后在函数上获得新指针,但PyImport_ReloadModule返回"导入错误"。


//.... code.. ..
//Reload the module
m_module = PyImport_ReloadModule(m_module);

有什么想法最好是 Poukill?

时间: 原作者:

0 0

答案是在我的第一篇文章( 感谢你的J.F 塞巴斯蒂安)的评论中找到的,PySys_SetPath 也必须包含 PYTHONPATH 。 这就是为什么 PyImport_ReloadModule 失败的原因。


QString sys_path = file_info.absolutePath() +";" +"C:Python34Lib";
PySys_SetPath(UTF8ToWide(sys_path.toUtf8().data()));
m_module = PyImport_ReloadModule(m_module);//Ok!

原作者:
...