Python C API - 重新加载模块

标签 python c++ python-3.x python-c-api

我使用 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);

有什么想法吗? 最好的祝福, 普基尔

最佳答案

答案在我第一篇文章的评论中找到(谢谢 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 C API - 重新加载模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28499381/

相关文章:

c++ - 有没有一本使用 C++ 编写控制台/终端应用程序的书?

c++ - 无法进入子目录

有多个字节顺序时的Python struct.unpack(ing)?

Python numpy 随机数概率

python - 在 Python 中使用 psycopg2 获取插入行到 Redshift 表中的自动 ID

python - 寻找循环素数

python - 如何使用 'for' 循环在 Python 2.7 中迭代嵌套列表索引项?

c++ - Qt HBoxLayout - 将小部件转换到新行

python - (Python 初学者)需要从类(class)开始

python - 聊天网站背后的想法