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

Python中如何不使用except、exit退出Discord bot且不终止主程序

问题核心原因

  • 你错误使用@bot.command()装饰了on_ready事件,该事件是discord.py内置的连接就绪触发事件,不需要command装饰器
  • bot.run()是阻塞调用,默认会占满当前线程直到bot停止,你原来的写法卡在这导致后续逻辑没法走,额外加的死循环也没有实际意义
  • 要避免影响主程序运行,只需要把bot的运行逻辑放到独立线程中执行即可

修复后代码

import asyncio
import discord
from discord.ext import commands
import threading

def post_discord(text):
    print('POSTING NEW OFFER TO DISCORD')
    token = 'token here'
    channel_id = 12345678  # 替换为你的频道ID

    # 独立封装bot运行逻辑
    def run_bot():
        # 配置意图,discord.py v2.x 版本必须配置
        intents = discord.Intents.default()
        intents.message_content = True
        bot = commands.Bot(command_prefix='!', intents=intents)

        @bot.event
        async def on_ready():
            channel = bot.get_channel(channel_id)
            # 发送目标消息
            await channel.send(text, file=discord.File('promo.png'))
            # 等待消息发送完成后主动关闭bot
            await asyncio.sleep(2)
            await bot.close()

        # bot调用close后run方法会自动退出,不会永久阻塞
        bot.run(token)

    # 放到独立守护线程启动,完全不影响主程序运行
    threading.Thread(target=run_bot, daemon=True).start()

注意事项

  • 如果你使用的是discord.py 2.0及以上版本,必须正确配置对应意图,否则会出现连接失败问题
  • 不要短时间内重复调用post_discord太频繁,避免触发Discord的接口频率限制
  • 确保promo.png文件路径正确,否则会抛出文件不存在的异常
  • 如果你的主程序本身就在使用asyncio事件循环,可以不用开线程,直接把bot的启动逻辑集成到主循环,用await bot.start(token)和await bot.close()控制即可

内容的提问来源于stack exchange,提问作者user13380963

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:06:00