You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:54:06