求助:2021年Discord Bot更新后遇ExtensionNotFound及RuntimeWarning错误
修复Discord Bot的两类更新错误
一、协程未等待警告的修复
Discord.py 2.x版本后,bot.load_extension从同步方法改为异步协程,直接调用会触发未等待警告,同时无法正确加载扩展。
解决步骤:
- 将加载扩展的逻辑放到异步函数中,用
await调用load_extension - 使用
asyncio.run()启动异步上下文,让协程能正常执行
修改后的核心代码片段:
import asyncio from os import listdir, path from os.path import isfile, join import discord from discord.ext import commands cogs_dir = "cogs" # 注意配置正确的Intents,Discord.py 2.x强制要求 bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) async def load_cogs(): for extension in [f.replace('.py', '') for f in listdir(cogs_dir) if isfile(join(cogs_dir, f))]: try: await bot.load_extension(f"{cogs_dir}.{extension}") print(f"成功加载扩展 {extension}") except Exception as e: print(f'加载扩展 {extension} 失败: {str(e)}') async def main(): await load_cogs() await bot.start("你的Bot令牌") if __name__ == '__main__': asyncio.run(main())
二、扩展加载失败(ExtensionNotFound)的修复
出现ExtensionNotFound: Extension 'cogs.mod' could not be loaded的常见原因及解决办法:
1. 检查Cogs文件夹结构
确保cogs是合法的Python包:
- 在
cogs文件夹内创建空的__init__.py文件(用来标识这是Python包,空文件即可) - 确认
mod.py文件确实存在于cogs文件夹中,文件名拼写完全一致(Linux系统注意大小写区分)
2. 完善异常捕获范围
原代码只捕获了discord.ClientException和ModuleNotFoundError,但ExtensionNotFound是独立的异常类,需要添加到捕获列表中,以便精准定位问题:
except (discord.ClientException, ModuleNotFoundError, commands.ExtensionNotFound) as e: print(f'加载扩展 {extension} 失败: {str(e)}')
3. 验证路径正确性
如果项目存在目录嵌套,要确保cogs_dir的路径正确。比如cogs在src子目录下,就需要把cogs_dir改成src/cogs。
最终完整代码示例
import asyncio from os import listdir from os.path import isfile, join import discord from discord.ext import commands # 配置Bot Intents,根据需求开启对应权限 intents = discord.Intents.default() intents.message_content = True bot = commands.Bot(command_prefix="!", intents=intents) cogs_dir = "cogs" async def load_all_cogs(): # 仅遍历cogs下的.py文件 cog_files = [f.replace('.py', '') for f in listdir(cogs_dir) if isfile(join(cogs_dir, f)) and f.endswith('.py')] for cog in cog_files: try: await bot.load_extension(f"{cogs_dir}.{cog}") print(f"✅ 加载扩展 {cog} 成功") except (commands.ExtensionNotFound, commands.ExtensionFailed, ModuleNotFoundError) as e: print(f"❌ 加载扩展 {cog} 失败: {str(e)}") async def main(): await load_all_cogs() await bot.start("你的Bot令牌") if __name__ == '__main__': asyncio.run(main())
内容的提问来源于stack exchange,提问作者TrilogyFM
相关产品推荐
相关产品推荐

