更换主机后运行Discord机器人报RuntimeError: Event loop is closed错误如何解决
问题根因
报错出现在bot.run()执行时尝试为当前异步事件循环添加SIGINT信号处理逻辑,但此时事件循环已被提前关闭。该问题和Token配置、业务代码无关,是新主机的运行环境、依赖版本差异导致的。
排查步骤
- 验证新旧主机的discord.py版本是否一致:执行
pip show discord.py查看版本号,跨大版本升级/降级很容易触发该类异步逻辑异常 - 确认脚本运行方式:如果使用nohup、systemd服务、docker容器等非交互式后台运行方式,这类环境会默认限制进程的信号处理权限,触发asyncio的事件循环检测异常
- 对比新旧主机的Python小版本:Python3.9的不同子版本对asyncio事件循环的默认关闭逻辑有差异,可执行
python3 --version确认版本是否匹配
修复方案
按优先级尝试以下方案:
方案1:禁用信号处理逻辑(适用90%以上场景)
修改bot.run调用参数,关闭内置的信号处理逻辑即可跳过报错代码:
# 将原有的bot.run(bot_token)替换为下面的代码 bot.run(bot_token, handle_signals=False)
后台运行场景下不需要处理终端传入的中断信号,该修改不会影响机器人的正常功能。
方案2:手动初始化事件循环
如果方案1无效,在代码最开头手动创建并指定新的事件循环:
import asyncio asyncio.set_event_loop(asyncio.new_event_loop()) # 后续原有代码保持不变 import discord from discord.ext import commands import os from dotenv import load_dotenv ...
方案3:对齐依赖版本
将新主机的discord.py版本调整为和旧主机完全一致,比如旧主机使用的是2.3.2版本,执行以下命令安装对应版本:
pip install discord.py==2.3.2
内容的提问来源于stack exchange,提问作者Bruh
相关产品推荐
相关产品推荐

