我有一个应用程序,旁边有 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 会调用新函数,但旧函数被调用。我做错了什么?
您的模块缓存在
sys.modules
字典中。当您使用 PyImport_Import
加载模块时,它会被缓存,当您尝试再次导入该模块而不从缓存中清除它时,Python 将重新使用缓存中已加载的模块,而不是从磁盘重新加载文件。
一旦检测到文件已更改,您应该使用
PyImport_ReloadModule()
函数重新加载模块。
这里的答案应该可以帮助您:刷新 C 嵌入式 python 中的导入