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

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配置:

    1. 打开Run > Edit Configurations
    2. 查看当前配置的Environment variables是否手动设置了DISCORD_TOKEN
    3. 若存在手动设置的变量,删除它,让脚本从.env文件读取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:20:32