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

使用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开发者门户开启对应权限:
    import discord
    from discord.ext import commands
    
    # 初始化基础Intents,按需添加所需权限
    intents = discord.Intents.default()
    intents.message_content = True  # 处理前缀命令时需要开启
    bot = commands.Bot(command_prefix="!", intents=intents)
    
    登录Discord开发者门户,进入Bot页面,开启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:45:14