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工具函数到独立模块
这是最彻底的解决方式,彻底避免循环导入:
- 新建
mongo_utils.py文件,将get_mongo()和dump_mongo()迁移到该文件:
# mongo_utils.py async def get_mongo(): # 原函数实现逻辑 pass async def dump_mongo(): # 原函数实现逻辑 pass
- 在
main.py中从新模块导入:
# main.py from mongo_utils import get_mongo, dump_mongo # ... 其他代码(包括client定义、事件监听等) client.run(discord_token)
- 在
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()的执行时机,避免模块导入时重复启动事件循环:
- 修改
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)
- 在
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:通过参数传递函数(无需导入)
如果不想调整模块结构,可以在启动任务时直接把函数作为参数传入:
- 在
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)
- 修改
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
相关产品推荐
相关产品推荐

