多层目录加载Cog模块报错,如何实现子目录模块加载?
问题解决:加载深层目录中的Python模块
你的问题核心是Python模块路径和文件系统路径搞混了,client.load_extension需要的是Python可识别的模块路径,不是直接的文件夹路径,所以才会报ModuleNotFoundError。
为什么原来的代码能运行?
你原来的代码里,commands文件夹应该已经是一个Python包(大概率有__init__.py文件),而且main目录在Python的模块搜索路径里,所以commands.test这种模块路径能被识别。
怎么加载深层目录的模块?
- 把目标子文件夹变成Python包:在
main/commands/testfolder(或者你说的commandFolder)里加一个空的__init__.py文件,Python才会把这个文件夹当作模块的一部分。 - 修正模块路径:
load_extension的参数要从顶层模块开始写,比如加载testfolder里的command.py,应该写成commands.testfolder.command,而不是testfolder.command。 - 递归遍历所有子目录:如果要批量加载所有深层的py文件,用
os.walk代替os.listdir,递归遍历每个文件夹:
import os async def load1(): # 遍历main/commands下的所有文件夹和文件 for root, dirs, files in os.walk("main/commands"): for filename in files: if filename.endswith(".py") and filename != "__init__.py": # 把文件系统路径转换成模块路径 # 比如main/commands/testfolder/command.py -> commands.testfolder.command relative_path = os.path.relpath(root, "main") module_path = relative_path.replace(os.sep, ".") + f".{filename[:-3]}" await client.load_extension(module_path)
关于包含非py文件的文件夹
完全可行!只要文件夹里有__init__.py,不管里面有json、txt还是其他文件,Python都能把它当作包,你只需要加载其中的py模块就行,其他文件不会影响模块加载。
内容的提问来源于stack exchange,提问作者Wolfie WS
相关产品推荐
相关产品推荐

