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

Python开发Discord Bot遇RuntimeError:asyncio.run无法在运行事件循环中调用

解决Jupyter Notebook中运行Discord机器人出现的RuntimeError

在Jupyter Notebook中运行Discord机器人代码时,执行client.run(os.getenv('TOKEN'))触发以下错误:

RuntimeError: asyncio.run() cannot be called from a running event loop error.

错误根源

Jupyter Notebook启动时会自动创建并运行一个asyncio事件循环,而discord.py的client.run()方法内部会调用asyncio.run()——这个函数的设计逻辑要求当前环境没有正在运行的事件循环,两者冲突因此抛出报错。


解决方案

方案一:改用client.start()直接在现有循环中运行

client.start()是协程函数,可以直接通过await在Jupyter已有的事件循环中执行,完美避开嵌套循环的问题。修改后的代码如下:

import os
import discord
import asyncio

# 替换为你的机器人TOKEN
os.environ['TOKEN'] = "MTA0Nzc3OTMzMjY2OTU5MTU3Mg.GUCNi9.Yro7C1zuxWoArhKYgJLXv7lmCdkcf0CQZhE7cc"

client = discord.Client(intents=discord.Intents.default())

@client.event
async def on_ready():
    print('We have 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!')

# 启动机器人
await client.start(os.getenv('TOKEN'))

# 若需要停止机器人,可单独在新单元格执行以下代码
# await client.close()

方案二:使用nest_asyncio允许嵌套事件循环

安装nest_asyncio库后,可以修改asyncio的默认行为,允许在已有循环中启动新的循环,这样就能正常使用client.run()。

  1. 先安装依赖库:
pip install nest_asyncio
  1. 修改后的代码:
import os
import discord
import nest_asyncio

# 启用嵌套事件循环支持
nest_asyncio.apply()

os.environ['TOKEN'] = "MTA0Nzc3OTMzMjY2OTU5MTU3Mg.GUCNi9.Yro7C1zuxWoArhKYgJLXv7lmCdkcf0CQZhE7cc"

client = discord.Client(intents=discord.Intents.default())

@client.event
async def on_ready():
    print('We have 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!')

client.run(os.getenv('TOKEN'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:50:33