Python 3.14 下 py-cord 创建 Bot 时为何报 event loop 错误?
结论
从 traceback 可以看出,异常发生在 discord.Bot() 初始化时。py-cord 的 Client.__init__ 调用了 asyncio.get_event_loop(),但主线程当时没有当前 event loop。日志指向本地 Python 与 py-cord 的初始化流程,没有显示错误由 Discord 服务端或机器人管理设置引起。
路径中的 pythoncore-3.14-64 表明这次运行使用的是 Python 3.14。日志无法确认已安装的 py-cord 版本是否兼容。可以先在正在运行的事件循环中创建 Bot,再启动连接。
在运行中的事件循环内创建 Bot
把 Bot 的创建和启动放进异步入口,并用 asyncio.run() 启动该入口。下面的示例通过异步上下文管理器关闭客户端。请将占位文本替换为机器人的 Token:
import asyncio
import discord
async def main():
async with discord.Bot() as bot:
await bot.start("YOUR_BOT_TOKEN")
asyncio.run(main())
调用 main() 中的 discord.Bot() 时,asyncio.run() 已启动事件循环,因此构造函数取得的是当前正在运行的 loop。在这个异步入口中,使用 await bot.start(...) 启动客户端。
如果原程序还注册了 slash commands、cogs 或事件处理器,请调整初始化顺序,让这些依赖 bot 的注册代码在创建 Bot 后执行。
确认运行环境与版本
先查看当前解释器和安装包信息:
py -3.14 --version
py -3.14 -m pip show py-cord
检查和运行时要使用同一个 Python 环境。如果异步入口仍然报错,或者项目需要保留原来的同步启动结构,请核对当前 py-cord 版本支持的 Python 版本和启动方式,再升级到兼容版本或使用该项目支持的 Python 版本。现有信息不足以确定具体的兼容版本号。
注意
traceback 中的关键调用是 asyncio.get_event_loop()。异常发生在 Bot 构造阶段,还没有进入登录流程。不要只为消除报错就手动创建 loop 并传给 Bot:如果库的启动入口随后又创建另一个 loop,客户端可能会与实际运行的事件循环不一致。优先在同一个异步入口中完成创建和启动。
备注:内容仅供参考。
