Jupyter运行Discord bot报RuntimeError: Cannot close a running event loop求助
问题解决方案
第一步:修复前置逻辑错误
你遇到的RuntimeError属于报错链的最后一环,首先要先解决更早出现的登录错误:
- 你没有调用
load_dotenv(),无法读取.env文件内的配置项,os.getenv("token")会返回空值 - 你调用
client.run()时传的是字符串'TOKEN',不是你读取到的TOKEN变量 on_message事件中message.user属于属性错误,该对象不存在user属性,应该判断是否为机器人自身的账号:if message.author == client.user:
第二步:解决Jupyter环境事件循环冲突
Jupyter本身会常驻一个运行中的asyncio事件循环,discord.py v1.7.3版本的client.run()方法在执行结束(无论成功还是报错)时会强制尝试关闭当前事件循环,就会触发你遇到的报错。你可以改用手动启动逻辑,跳过自动清理循环的步骤,修改后的完整代码如下:
import asyncio import nest_asyncio nest_asyncio.apply() import discord import os from dotenv import load_dotenv # 加载.env文件配置 load_dotenv() client = discord.Client() @client.event async def on_ready(): print('Logged in as {0.user}'.format(client)) @client.event async def on_message(message): # 忽略机器人自己发送的消息 if message.author == client.user: return if message.content.startswith('$hello'): await message.channel.send('Hello!') # 读取.env中的token值 TOKEN = os.getenv("token") # 替换默认的run方法,手动启动避免关闭循环 loop = asyncio.get_event_loop() loop.create_task(client.start(TOKEN))
如果需要停止运行的机器人,执行await client.close()即可,不需要关闭事件循环。
内容的提问来源于stack exchange,提问作者ASIM
相关产品推荐
相关产品推荐

