importlib.reload无法更新__init__.py导入的子模块值,如何解决?
问题分析
你遇到的核心问题是:importlib.reload()仅会重新加载指定模块,不会自动递归处理它依赖的子模块;同时当主模块通过from .sub import version_info_sub直接导入变量时,该变量会被绑定到主模块的命名空间,后续即使子模块更新,主模块里的旧绑定也不会自动同步。
解决方案
下面提供两种直接有效的解决方式:
方法一:先重载子模块,再重载主模块
修改主代码,先重新加载子模块,让子模块的变量更新,再重载主模块触发重新导入操作:
from importlib import reload import version_info from version_info import sub # 第一步:重载子模块,更新sub.py里的变量 reload(sub) # 第二步:重载主模块,重新执行导入语句绑定新变量 reload(version_info) print(version_info.version_string) # 正常更新 print(version_info.version_info_sub) # 现在会拿到修改后的新值
方法二:修改导入方式,避免直接绑定变量
调整version_info/__init__.py的导入逻辑,改为保留对子模块的引用,而非直接导入变量:
from . import sub version_string = "6"
主代码中通过主模块间接访问子模块的变量,重载子模块后即可获取最新值:
from importlib import reload import version_info # 重载子模块更新变量 reload(version_info.sub) # 可选:如果主模块自身有修改,再重载主模块 reload(version_info) print(version_info.version_string) print(version_info.sub.version_info_sub) # 直接访问子模块变量,自动同步更新
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

