如何用importlib遍历.py配置文件?迭代时模块未更新问题
解决Python遍历导入模块时未更新的问题
我尝试用modl作为前缀,遍历用作配置文件的.py文件(选.py是因为方便声明和导入函数、变量),但第二次迭代时模块没更新。
代码示例
for settingsfile in ['settings1.py', 'settings2.py']: modl = importlib.import_module(settingsfile) var1 = modl.var1 print('the variable:', var1)
输出结果
the variable:var1_from_settings1 the variable:var1_from_settings1
问题原因
Python的模块导入机制会把已导入的模块缓存到sys.modules字典里,第二次调用importlib.import_module()时,不会重新读取目标文件,直接返回缓存中的模块对象,所以两次拿到的都是第一次导入的settings1.py内容。
解决方法
方法1:导入前删除缓存中的模块
每次循环时先检查sys.modules里是否有目标模块,有就删掉,再重新导入,这样就能保证每次都是读取最新的文件内容:
import importlib import sys for settingsfile in ['settings1', 'settings2']: # 注意去掉.py后缀,import_module不需要这个 if settingsfile in sys.modules: del sys.modules[settingsfile] modl = importlib.import_module(settingsfile) var1 = modl.var1 print('the variable:', var1)
方法2:使用importlib.reload()重新加载
如果先导入了模块,后续可以用reload()强制重新读取文件,但要注意必须先导入模块才能调用reload():
import importlib for settingsfile in ['settings1', 'settings2']: modl = importlib.import_module(settingsfile) modl = importlib.reload(modl) # 强制重新加载模块 var1 = modl.var1 print('the variable:', var1)
注意:
importlib.import_module()的参数不需要带.py后缀,直接传入模块名即可(文件需在Python可识别的路径下,比如当前工作目录)。
内容的提问来源于stack exchange,提问作者tincan
相关产品推荐
相关产品推荐

