使用Ctrl+C关闭Discord Bot触发异常,替换bot.run致斜杠命令失效求助
问题解答
关于Ctrl+C触发异常的情况
这两个异常属于正常现象,并非代码错误:
KeyboardInterrupt是系统响应Ctrl+C中断信号抛出的标准异常,所有Python进程收到Ctrl+C时都会触发。asyncio.exceptions.CancelledError是asyncio.run()的正常终止流程:当捕获到中断信号后,asyncio.run()会主动取消当前运行的异步任务链,进而触发该异常。
替换asyncio.run为bot.run后斜杠命令失效的解决办法
discord.py v2.x中bot.run()内部封装了asyncio.run()的逻辑,完全支持混合命令(前缀+斜杠),失效问题大概率是配置或代码逻辑问题,可按以下步骤排查修复:
- 启用必要的Intents:
斜杠命令需要确保Bot配置了正确的Intents,且在Discord开发者门户开启对应权限:
登录Discord开发者门户,进入Bot页面,开启import discord from discord.ext import commands # 初始化基础Intents,按需添加所需权限 intents = discord.Intents.default() intents.message_content = True # 处理前缀命令时需要开启 bot = commands.Bot(command_prefix="!", intents=intents)Privileged Gateway Intents下的Message Content Intent(如果用到前缀命令)。 - 正确同步斜杠命令:
用@bot.tree.command()定义的斜杠命令,必须同步到Discord服务器才能生效,可在on_ready事件中添加同步逻辑:@bot.event async def on_ready(): # 测试环境建议指定服务器同步,立即生效 await bot.tree.sync(guild=discord.Object(id=1234567890)) # 替换为你的服务器ID # 生产环境用全局同步:await bot.tree.sync()(需1小时左右生效) print(f"已登录为 {bot.user}") - 规范
bot.run的调用:
直接调用bot.run()传入Token即可,无需额外异步封装:if __name__ == "__main__": bot.run("你的Bot Token")
内容的提问来源于stack exchange,提问作者Effectys
相关产品推荐
相关产品推荐

