Python C API,更改Python文件并调用修改后的方法

问题描述 投票:0回答:1

我有一个应用程序,旁边有 python 文件,将从中调用方法。理想情况下,应该跟踪文件更改,如果文件更改,则加载该文件并调用更改的方法。 例如python代码下载:

    auto p_name = PyUnicode_FromString(_python_file_name.c_str());
    if (!p_name) {
        ...
    }
    auto module = PyImport_Import(p_name);
    if (!module) {
        ...
    }
    _dict = PyModule_GetDict(module);
    if (!_dict) {
        ...

以及代码函数调用

    tryUpdateFile();  //checks when the file was changed, and if necessary, uploads a new one
    auto p_func = PyDict_GetItemString(_dict, "createPacket");
    if (!p_func || !PyCallable_Check(p_func)) {
        ...
    }
    p_return = PyObject_CallFunction(p_func, "i", id);
    auto res = parseStringFromPython(p_return);   //parse return to string
    Py_XDECREF(p_return);
    return res;

我预计在更改模块后 PyObject_CallFunction 会调用新函数,但旧函数被调用。我做错了什么?

c++ python-c-api
1个回答
0
投票

您的模块缓存在

sys.modules
字典中。当您使用
PyImport_Import
加载模块时,它会被缓存,当您尝试再次导入该模块而不从缓存中清除它时,Python 将重新使用缓存中已加载的模块,而不是从磁盘重新加载文件。

一旦检测到文件已更改,您应该使用

PyImport_ReloadModule()
函数重新加载模块。

这里的答案应该可以帮助您:刷新 C 嵌入式 python 中的导入

© www.soinside.com 2019 - 2024. All rights reserved.