Python C API - 重新加载模块

2024-10-03 23:26:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python3.4和visual2010。 我使用C API嵌入Python,以便在处理数据时为用户提供一些脚本功能。我从C++代码中调用用户定义的Python函数。例如,我调用特定的函数,比如Apply(),用户必须在Python文件中定义它。 假设用户有一个文件测试.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”。在

^{pr2}$

有什么想法吗? 谨致问候, 普基尔


Tags: 模块文件数据函数用户脚本apidata
1条回答
网友
1楼 · 发布于 2024-10-03 23:26:16

答案在我第一篇文章的评论中找到了(谢谢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 !

相关问题 更多 >