首页 > 解决方案 > 在 Linux 中未使用 load_dotenv() 加载环境变量

问题描述

我正在尝试制作一个不和谐的机器人,当我尝试使用 load_dotenv() 加载 .env 时它不起作用,因为它说

Traceback (most recent call last):
  File "/home/fanjin/Documents/Python Projects/Discord Bot/bot.py", line 15, in <module>
    client.run(TOKEN)
  File "/home/fanjin/.local/lib/python3.8/site-packages/discord/client.py", line 708, in run
    return future.result()
  File "/home/fanjin/.local/lib/python3.8/site-packages/discord/client.py", line 687, in runner
    await self.start(*args, **kwargs)
  File "/home/fanjin/.local/lib/python3.8/site-packages/discord/client.py", line 650, in start
    await self.login(*args, bot=bot)
  File "/home/fanjin/.local/lib/python3.8/site-packages/discord/client.py", line 499, in login
    await self.http.static_login(token.strip(), bot=bot)
AttributeError: 'NoneType' object has no attribute 'strip

这是我的机器人代码:

import os

import discord
from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')

client = discord.Client()

@client.event
async def on_ready():
    print(f'{client.user} has connected to Discord!')

client.run(TOKEN)

还有 save.env 文件:(这是一个假令牌)

# .env
DISCORD_TOKEN={Bzc0NjfUH8fEWFjg2NDMyMjY2.X6coqw.JyiOR89JIH7fFFoyOMufK_1A}

这两个文件都在同一个目录中,我什至尝试使用显式指定 .env 的路径

env_path = Path('path/to/file') / '.env'
load_dotenv(dotenv_path=env_path)

但这也没有用

标签: pythonlinuxenvironment-variablesdotenv

解决方案


我遇到了类似的问题,并发现了这三个可能的解决方案/原因:
  1. 检查 .env 文件中的语法是否正确,原始文档将是最佳来源 - Python Dotenv(示例如下)

     DOMAIN=example.org
     ADMIN_EMAIL=admin@${DOMAIN}
     ROOT_URL=${DOMAIN}/app
    
  2. 对我有用的解决方案是使用find_dotenv()而不是里面的文件路径load_dotenv(),原因是load_dotenv()没有正确加载 .env 文件。find_dotenv()如果 .env 文件与您的代码文件位于同一文件夹中,该函数会自动查找该文件。

     from dotenv import load_dotenv, find_dotenv
    
     load_dotenv(find_dotenv())
    
  3. 您可以将搜索限制在当前项目文件夹中sys.path[1],以确保您正在阅读预期的文件。

     import sys
     from dotenv import load_dotenv
     load_dotenv(sys.path[1]) #try .path[0] if 1 doesn't work
    

因为,我将.env文件移动到另一个子文件夹config中,所以我必须提供完整路径才能load_dotenv()使其工作。

import sys
from dotenv import load_dotenv
path = sys.path[1]+'/config/.env'  #try .path[0] if 1 doesn't work
load_dotenv(path)

[编辑]


推荐阅读