Python Discord程序结束时触发RuntimeError: Event loop is closed的解决方法
解决Discord.py中
RuntimeError: Event loop is closed的问题 这个报错我之前也踩过坑,核心原因是client.run(TOKEN)本身会全权负责事件循环的启动、运行和收尾工作,你在on_ready事件里直接调用await client.close()会强制提前关闭事件循环,但client.run()后续还会尝试对已经关闭的循环执行清理操作,这就导致了冲突报错。
下面给你两种靠谱的解决方式:
方式一:手动管理事件循环(推荐)
如果你只是想让机器人启动后完成一次性任务(比如收集所有成员)就退出,那直接跳过client.run(),手动控制登录、连接和关闭的流程会更稳妥:
import asyncio import discord async def main(): # 注意要开启对应的intents,不然可能拿不到成员列表 client = discord.Client(intents=discord.Intents.all()) await client.login(TOKEN) await client.connect() # 简化你的成员收集逻辑,比逐个insert更高效 members = [] for guild in client.guilds: members.extend(guild.members) # 这里可以添加对members的后续处理 print(f"总共收集到{len(members)}个成员") await client.close() asyncio.run(main())
额外提醒:记得在Discord开发者后台开启Server Members Intent权限,不然guild.members会返回空列表哦。
方式二:在on_ready中异步执行关闭操作
如果你坚持要用client.run(),可以把关闭操作放到异步任务里执行,避免阻塞on_ready的执行流程,让client.run()能正常处理收尾:
import asyncio import discord client = discord.Client(intents=discord.Intents.all()) @client.event async def on_ready(): members = [] for guild in client.guilds: members.extend(guild.members) # 用create_task异步执行关闭,让on_ready先正常结束 asyncio.create_task(client.close()) client.run(TOKEN)
另外提个小建议:你原来代码里的members.insert(amount2, member)完全可以换成members.append(member),效果完全一样,还不用维护amount2这个变量,代码更简洁~
内容的提问来源于stack exchange,提问作者S0V3T
相关产品推荐
相关产品推荐

