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

Python开发Discord Bot加载Cogs时遇asyncio事件循环错误求助

解决Discord Bot加载Cogs时的RuntimeError问题

问题根源

从错误回溯日志可以明确:你的cogs/fun.py文件中执行了from Test import bot,这会触发主文件Test.py的完整二次执行,而主文件末尾的bot.run()会再次尝试启动事件循环。但此时Bot已经处于运行状态,事件循环早已存在,因此抛出RuntimeError: asyncio.run() cannot be called from a running event loop——这是典型的循环导入问题。

Cog文件完全不需要直接导入主文件的bot实例,因为Discord.py的setup函数会自动传入bot参数,你只需要在Cog类的构造函数中接收该参数即可。

解决方案

1. 修正Cog文件,移除循环导入

以fun.py为例,删除from Test import bot这一行,调整Cog类的定义:

import discord
from discord.ext import commands

class Fun(commands.Cog):
    def __init__(self, bot):
        self.bot = bot  # 通过构造函数接收bot实例

    # 示例命令
    @commands.command()
    async def hello(self, ctx):
        await ctx.send("Hello from Fun Cog!")

async def setup(bot):
    await bot.add_cog(Fun(bot))

misc.py和mod.py也需要做同样的修改,移除对主文件bot的导入。

2. 优化主文件的Cog加载逻辑(可选但推荐)

将Cog加载移到bot.run()之前,使用同步的load_extension方法,避免在on_ready事件中加载(虽然on_ready也能工作,但启动前加载更直观且不易出问题):

# 保留原有bot实例创建代码
bot = commands.Bot(command_prefix=commands.when_mentioned_or(
    config["prefix"]), intents=intents, help_command=None)

cogs = ['cogs.fun', 'cogs.mod', 'cogs.misc']

# 在bot启动前加载所有Cogs
for cog in cogs:
    try:
        bot.load_extension(cog)
        print(f"成功加载扩展: {cog}")
    except Exception as e:
        print(f"加载扩展{cog}失败: {str(e)}")

@bot.event
async def on_ready():
    print(f'已登录为: {bot.user.name}')
    print(f'用户ID: {bot.user.id}')
    status_task.start()  # 启动状态循环任务

# 保留原有on_command_error等代码...

bot.run(config["token"], reconnect=True)

3. 修复主文件的小问题

  • 移除开头重复的import json语句;
  • 在on_ready中添加status_task.start(),否则你的状态循环任务不会运行。

验证

修改完成后运行主文件,Bot将正常加载所有Cogs,不再出现事件循环相关错误,命令可以正常响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:31:03