导入文件夹内Python模块到列表后调用update方法报错的问题
问题:导入Mod模块后无法调用update()方法
问题原因
你使用importlib.__import__()时踩了一个常见坑:这个函数默认返回顶层模块(也就是Assets),而非你真正要导入的子模块Assets.mods.scripts.xxx。所以你的mods列表里存的全是Assets模块,调用update()自然会报错——因为Assets模块根本没有这个方法。
解决方案
有两种修复方式,推荐第二种(代码更直观):
方式1:修改原__import__调用,添加fromlist参数
给importlib.__import__加上fromlist=['']参数,强制它返回目标子模块:
import os import importlib mods = [] dirs = os.listdir('Assets/mods/scripts/') for filename in dirs: if not filename.endswith('.py'): continue module_name = 'Assets.mods.scripts.' + filename.removesuffix('.py') try: # 添加fromlist参数,获取目标子模块而非顶层模块 module = importlib.__import__(module_name, fromlist=['']) mods.append(module) except Exception as e: print(f'importing error: {e}')
方式2:改用importlib.import_module(推荐)
importlib.import_module()是专门用于模块导入的方法,直接返回目标子模块,代码更清晰易读:
import os import importlib mods = [] dirs = os.listdir('Assets/mods/scripts/') for filename in dirs: if not filename.endswith('.py'): continue module_name = 'Assets.mods.scripts.' + filename.removesuffix('.py') try: # 直接获取目标子模块 module = importlib.import_module(module_name) mods.append(module) except Exception as e: print(f'importing error: {e}')
调用代码优化(可选)
把索引遍历改成直接遍历模块,更符合Python风格:
for mod in mods: try: mod.update() except Exception as e: print(f'updating error: {e}')
额外注意事项
- 确保每个Mod的
.py文件里确实定义了update()函数,否则调用时仍会报错。 - 确认
Assets所在目录在Python的sys.path中,否则导入阶段就会失败(可以通过import sys; print(sys.path)检查)。
内容的提问来源于stack exchange,提问作者TheDumbCoder
相关产品推荐
相关产品推荐

