Discord机器人加载cogs目录子文件夹命令时出现ExtensionNotFound错误咨询
错误原因
- 模块路径格式不符合要求
discord.py的load_extension方法要求传入Python标准的模块导入路径,必须用.分隔目录层级,不能使用文件系统的斜杠/反斜杠。你当前代码处理后生成的路径为cogs.commands\\general\\help,混合了点和Windows反斜杠(反斜杠还会触发转义逻辑),完全无法被Python识别为合法模块路径。 - 缺少Python包标识文件
所有需要被作为模块导入的目录,都需要在目录下放置一个空的__init__.py文件来标记为Python包。你需要确认cogs/、cogs/commands/、cogs/commands/general/三级目录下都有该文件。 - 路径截取逻辑硬编码易出错
你写的py_file[5:-3]是硬编码截取路径的前5位,仅在特定路径长度下生效,一旦目录层级、路径分隔符发生变化,就会出现截取错误。
你的文件夹结构参考:
解决方案
步骤1:补全包标识文件
在cogs/、cogs/commands/、cogs/commands/general/每个目录下,新建一个空白的__init__.py文件。
步骤2:替换加载逻辑代码
使用更健壮的递归遍历逻辑,自动处理路径转换,无需手动写多层循环,兼容全平台:
from pathlib import Path # 递归遍历cogs目录下所有.py后缀的文件 for py_file in Path("cogs").rglob("*.py"): # 跳过不需要加载的__init__.py文件 if py_file.name == "__init__.py": continue # 将文件路径转换为标准模块导入格式:例如cogs/commands/general/help.py 转为 cogs.commands.general.help module_path = py_file.as_posix().replace("/", ".").removesuffix(".py") try: client.load_extension(module_path) print(f"加载成功:{module_path}") except Exception as e: print(f"加载失败[{module_path}]:{str(e)}")
这段代码会自动处理所有层级的子目录cog加载,不需要你手动调整遍历层数,也不会出现路径分隔符的转义错误,额外的异常捕获还能帮你定位cog内部代码错误导致的加载失败问题。
内容的提问来源于stack exchange,提问作者lolnoob lolnooa
相关产品推荐
相关产品推荐

