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
相关产品推荐
相关产品推荐

