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

导入文件夹内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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:47:40