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

discord.py项目导入main.py函数引发asyncio.run()错误求助

解决Discord.py中的循环导入与事件冲突问题

问题描述

项目中main.py包含client.run(discord_token)执行逻辑,以及get_mongo()、dump_mongo()两个异步函数;/Web_Interaction/loopty_loop.py的循环任务需要调用这两个函数:

  • 若在函数内部导入from main import get_mongo, dump_mongo,会触发RuntimeError: asyncio.run() cannot be called from a running event loop错误
  • 若把导入移到函数外部,会出现循环导入问题

解决方案

方案1:拆分Mongo工具函数到独立模块

这是最彻底的解决方式,彻底避免循环导入:

  1. 新建mongo_utils.py文件,将get_mongo()和dump_mongo()迁移到该文件:
# mongo_utils.py
async def get_mongo():
    # 原函数实现逻辑
    pass

async def dump_mongo():
    # 原函数实现逻辑
    pass
  1. 在main.py中从新模块导入:
# main.py
from mongo_utils import get_mongo, dump_mongo

# ... 其他代码(包括client定义、事件监听等)

client.run(discord_token)
  1. 在loopty_loop.py中同样从新模块导入:
# loopty_loop.py
from discord.ext import tasks
from mongo_utils import get_mongo, dump_mongo

@tasks.loop(time=times)
async def curate(client, channel, mongo_client):
    print('curating...')
    # 直接调用函数即可
    await get_mongo()
    await dump_mongo()
    # ... 其他逻辑

方案2:重构main.py的执行入口

通过限制client.run()的执行时机,避免模块导入时重复启动事件循环:

  1. 修改main.py,将client.run()放入if __name__ == "__main__":代码块:
# main.py
async def get_mongo():
    # 原函数逻辑
    pass

async def dump_mongo():
    # 原函数逻辑
    pass

# ... 其他代码(client定义、事件监听等)

if __name__ == "__main__":
    # 只有当直接运行main.py时才启动客户端
    client.run(discord_token)
  1. 在loopty_loop.py中直接在顶部导入函数:
# loopty_loop.py
from discord.ext import tasks
from main import get_mongo, dump_mongo

@tasks.loop(time=times)
async def curate(client, channel, mongo_client):
    print('curating...')
    # 正常调用函数
    await get_mongo()
    # ... 其他逻辑

方案3:通过参数传递函数(无需导入)

如果不想调整模块结构,可以在启动任务时直接把函数作为参数传入:

  1. 在main.py的on_ready事件中启动任务时,传入get_mongo和dump_mongo:
# main.py
from Web_Interaction.loopty_loop import curate

async def on_ready():
    # 启动任务时传入需要的函数
    await curate.start(client, channel, mongo_client, get_mongo, dump_mongo)
  1. 修改loopty_loop.py中的curate函数,接收这两个函数参数:
# loopty_loop.py
from discord.ext import tasks

@tasks.loop(time=times)
async def curate(client, channel, mongo_client, get_mongo, dump_mongo):
    print('curating...')
    # 直接使用传入的函数
    await get_mongo()
    await dump_mongo()
    # ... 其他逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:00:15