Discord机器人开发:Python中Event loop closed错误及Token加载异常排查
Discord机器人Token加载失败排查与解决
问题场景
我在PyCharm中开发Discord机器人,使用的代码如下:
# bot.py import os import discord from dotenv import load_dotenv load_dotenv() TOKEN = os.getenv('DISCORD_TOKEN') GUILD = os.getenv('DISCORD_GUILD') client = discord.Client() @client.event async def on_ready(): for guild in client.guilds: if guild.name == GUILD: break print( f'{client.user} is connected to the following guild:\n' f'{guild.name}(id: {guild.id})' ) client.run(TOKEN)
运行后出现以下错误:
Traceback (most recent call last): File "C:\Users\elrod\venv\lib\site-packages\discord\http.py", line 300, in static_login data = await self.request(Route('GET', '/users/@me')) File "C:\Users\elrod\venv\lib\site-packages\discord\http.py", line 254, in request raise HTTPException(r, data) discord.errors.HTTPException: 401 Unauthorized (error code: 0): 401: Unauthorized The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\elrod\OneDrive\Desktop\Assignments\CPSC\Python\HextchLibraryApp\HextechLibrary.py", line 25, in <module> client.run(TOKEN) File "C:\Users\elrod\venv\lib\site-packages\discord\client.py", line 723, in run return future.result() File "C:\Users\elrod\venv\lib\site-packages\discord\client.py", line 702, in runner await self.start(*args, **kwargs) File "C:\Users\elrod\venv\lib\site-packages\discord\client.py", line 665, in start await self.login(*args, bot=bot) File "C:\Users\elrod\venv\lib\site-packages\discord\client.py", line 511, in login await self.http.static_login(token.strip(), bot=bot) File "C:\Users\elrod\venv\lib\site-packages\discord\http.py", line 304, in static_login raise LoginFailure('Improper token has been passed.') from exc discord.errors.LoginFailure: Improper token has been passed. Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x0000022950CEF160> Traceback (most recent call last): File "C:\Users\elrod\AppData\Local\Programs\Python\Python39\lib\asyncio\proactor_events.py", line 116, in __del__ self.close() File "C:\Users\elrod\AppData\Local\Programs\Python\Python39\lib\asyncio\proactor_events.py", line 108, in close self._loop.call_soon(self._call_connection_lost, None) File "C:\Users\elrod\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 751, in call_soon self._check_closed() File "C:\Users\elrod\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 515, in _check_closed raise RuntimeError('Event loop is closed') RuntimeError: Event loop is closed Process finished with exit code 1
已知信息:.env文件中DISCORD_GUILD能正常读取,但DISCORD_TOKEN无法正确加载——直接将token粘贴到client.run()中可正常运行,重置新token也无效。
可能的原因及解决方法
.env文件中Token格式错误
检查.env内的DISCORD_TOKEN是否存在多余空格、引号或换行符。
错误示例:DISCORD_TOKEN = "your_token "(末尾带空格)、DISCORD_TOKEN='your_token'(带单引号)
正确格式:DISCORD_TOKEN=your_token_value(无多余符号,直接键值对)load_dotenv()未指定.env文件路径
如果.env文件不在脚本的同级目录,需要显式指定路径:load_dotenv(dotenv_path='./relative/path/to/.env') # 或使用绝对路径 load_dotenv(dotenv_path='C:/Users/elrod/your-project/.env')可先打印当前工作目录确认路径是否正确:
print(os.getcwd())Token包含隐形字符
复制Token时可能带入隐形字符,在代码中添加打印语句查看加载后的Token:print(f"Loaded Token: [{TOKEN}]")如果输出的方括号内存在额外空格或不可见字符,需清理
.env文件内容,手动重新输入Token(避免直接复制粘贴,或粘贴后删除多余字符)PyCharm环境变量缓存/覆盖
重启PyCharm,同时检查Run/Debug配置:- 打开Run > Edit Configurations
- 查看当前配置的Environment variables是否手动设置了
DISCORD_TOKEN - 若存在手动设置的变量,删除它,让脚本从
.env文件读取
内容的提问来源于stack exchange,提问作者Jack Hermanson
相关产品推荐
相关产品推荐

