Python C API - 重新加载模块
Python C API - Reload a module
我使用 Python 3.4 和 Visual 2010。
我正在使用 C API 嵌入 Python,以便为用户提供一些处理其数据的脚本功能。我从我的 C++ 代码中调用用户定义的 python 函数。我调用特定函数,例如 Apply(),例如用户必须在 Python 文件中定义。
假设用户有一个文件 test.py,他在其中定义了一个处理某些数据的函数 Apply()。
我所要做的就是导入他的模块并从 C++ 中为他的 python 函数获取 "pointer"。
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 returns NULL with "Import error".
// .... code ....
// Reload the module
m_module = PyImport_ReloadModule(m_module);
有什么想法吗?
此致,
普基尔
答案是在我的第一个 post(谢谢 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 !
我使用 Python 3.4 和 Visual 2010。 我正在使用 C API 嵌入 Python,以便为用户提供一些处理其数据的脚本功能。我从我的 C++ 代码中调用用户定义的 python 函数。我调用特定函数,例如 Apply(),例如用户必须在 Python 文件中定义。 假设用户有一个文件 test.py,他在其中定义了一个处理某些数据的函数 Apply()。 我所要做的就是导入他的模块并从 C++ 中为他的 python 函数获取 "pointer"。
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 returns NULL with "Import error".
// .... code ....
// Reload the module
m_module = PyImport_ReloadModule(m_module);
有什么想法吗? 此致, 普基尔
答案是在我的第一个 post(谢谢 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 !