在Heroku部署Discord Bot时,如何从.env文件正确获取令牌并解决导入错误
解决Heroku上Discord Bot无法读取TOKEN环境变量的问题
你遇到的问题主要源于两个关键点:模块名冲突,以及.env文件的错误加载方式,我来一步步帮你解决:
1. 解决模块导入冲突
你写的from token import TOKEN会被Python误认为是导入标准库自带的token模块(这个模块用于处理Python代码的词法分析,和你的自定义.env文件完全无关),这就是触发ImportError的核心原因。
2. 正确加载.env文件的环境变量
.env格式的配置文件需要专门的库来解析,推荐使用python-dotenv工具:
步骤1:添加依赖到requirements.txt
确保你的requirements.txt包含以下内容(Heroku会自动安装这些依赖):
discord.py python-dotenv
步骤2:修改main.py的代码逻辑
替换原来的导入方式,改用dotenv加载环境变量:
import discord import os from dotenv import load_dotenv # 加载token.env文件中的配置变量 load_dotenv('token.env') token = os.getenv('TOKEN') client = discord.Client() @client.event async def on_message(message): if message.author == client.user: return msg = message.content if msg.startswith('$hello'): await message.channel.send('Hello!') client.run(token)
步骤3:修正token.env的格式
.env文件中不要添加多余空格,正确格式应为:
TOKEN=your_bot_token_here
3. 更安全的Heroku环境变量配置(推荐)
在Heroku平台上,直接使用内置的Config Vars存储敏感信息(比如Bot令牌)比上传.env文件更安全、更便捷:
- 打开Heroku控制台,进入你的应用页面
- 切换到
Settings标签,找到Config Vars区域 - 点击
Reveal Config Vars,添加一个键为TOKEN、值为你的Bot令牌的变量
这种方式下,你的main.py可以进一步简化(无需.env文件和python-dotenv依赖):
import discord import os token = os.getenv('TOKEN') client = discord.Client() @client.event async def on_message(message): if message.author == client.user: return msg = message.content if msg.startswith('$hello'): await message.channel.send('Hello!') client.run(token)
4. 确认Procfile和服务状态
你的Procfile配置是正确的:
worker: python main.py
你已经在Heroku控制台启动了worker服务,这部分无需调整。
最后重新部署代码到Heroku,你的Bot就能正常读取TOKEN并启动了!
内容的提问来源于stack exchange,提问作者Joshua Edwards
相关产品推荐
相关产品推荐

