我使用Python 3.4和Visual 2010。 我使用C API嵌入Python,为用户提供处理数据的一些脚本功能。我从我的C ++代码中调用用户定义的python函数。我调用像Apply()这样的特定函数,例如用户必须在Python文件中定义。 假设用户有一个文件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并带有"导入错误"。
// .... code ....
// Reload the module
m_module = PyImport_ReloadModule(m_module);
有什么想法吗? 最好的祝福, Poukill
答案 0 :(得分:1)
答案在我的第一篇文章的评论中找到(谢谢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 !