QGIS 3.24.1运行Python脚本字典值缓存异常解决方法
问题原因
两个核心问题共同导致该现象,和QGIS项目缓存无关:
- Python长驻进程的模块缓存机制:QGIS的Python控制台、脚本编辑器是单进程长驻运行的,不会像PyCharm每次运行脚本都重启Python解释器。首次导入自定义模块后,模块对象会一直存在Python的
sys.modules缓存里,后续再执行导入语句不会重新执行模块代码、读取最新CSV,只会直接返回缓存的模块对象。哪怕执行del dict_name,只是删除当前命名空间的变量引用,sys.modules里缓存的模块和其中的字典对象依然存在,下次导入还是拿到被修改过的旧字典。 - 原地修改导入对象+嵌套赋值逻辑错误:你直接对导入的
dict_name做原地修改,修改会直接作用在缓存的模块对象上;同时dict_name[key] = dict_name[key], added_value的写法会把原有值和新值打包成新元组赋值,每运行一次就多嵌套一层元组,第二次运行时原始键对应的值已经变成(原始4个配置值, 第一次运行追加的added_value),自然会出现取[1]拿到上次追加值、必须取[0][1]才能拿到原始值的问题。
解决步骤
按以下顺序调整代码即可,不需要重启QGIS:
- 不要把自定义脚本放到QGIS安装目录的
apps\qgis\python路径下,新建独立目录存放你的字典生成脚本、主脚本,运行前先把目录加入Python路径,避免权限、加载优先级问题:
import sys # 替换为你自己的脚本存放文件夹路径,注意用正斜杠或者双反斜杠 custom_script_dir = "D:/my_qgis_scripts" if custom_script_dir not in sys.path: sys.path.append(custom_script_dir)
- 每次运行主脚本前,强制重载配置生成模块,确保读取最新CSV生成全新的原始配置字典,绕过模块缓存:
import importlib # 替换为你的字典生成脚本的文件名,不带.py后缀,比如脚本叫layer_config.py就填layer_config import layer_config_generator importlib.reload(layer_config_generator) from layer_config_generator import dict_name as raw_layer_config
- 不要直接修改导入的原始配置字典,每次运行时先做深拷贝生成独立操作副本,所有修改都在副本上执行,避免污染原始模块对象:
import copy # 生成独立副本,后续所有操作都用这个变量,不要碰raw_layer_config working_config = copy.deepcopy(raw_layer_config)
- 修正追加配置值的逻辑,不要用嵌套元组的写法,避免多层嵌套:
# 替换你原来的new_dict[cat] = dict_name[cat], full_fltr_lst逻辑 for cat, full_fltr_lst in 你原来的循环迭代对象: # 把原始不可变元组转成可变列表,再追加新值,不会产生嵌套 current_config = list(working_config[cat]) current_config.append(full_fltr_lst) working_config[cat] = current_config
- 后续所有图层导入、过滤器添加逻辑,全部读取
working_config里的值即可,不需要修改访问路径的索引。
额外说明
QgsProject.instance().clear()只会清空QGIS项目里的图层、布局等项目内对象,不会清理Python解释器的模块缓存、全局变量,所以解决不了这个问题。
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

