【问题标题】:Environment Variable not loading with load_dotenv() in Linux在 Linux 中未使用 load_dotenv() 加载环境变量
【发布时间】:2021-02-20 08:06:50
【问题描述】:

我正在尝试制作一个不和谐的机器人,当我尝试使用 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)

但这也没用

【问题讨论】:

  • 如果这主要是关于 dotenv 库的问题,它不是 Python 或 Linux 本身的一部分,请考虑为该库添加标签。
  • 顺便说一句,这是一个猜测,但是如果您引用令牌的值,它会起作用吗?即:DISCORD_TOKEN='{...}'
  • ...包含异常的堆栈跟踪也很有帮助;如果我们知道最初是哪一行引发了异常,我们就会知道哪个值意外地是None,而不是包含一个字符串。
  • @CharlesDuffy 很抱歉迟到了,我正在使用我通过 pip 安装的 python-dotenv 库。我尝试引用它,但它不起作用,我更新了帖子以包含完整的堆栈跟踪
  • 好的,这个错误告诉你token 是None;它不是直接从 dotenv 代码本身抛出的。

标签: python linux environment-variables dotenv


【解决方案1】:

我在尝试在 ubuntu 20.04 和 python-dotenv 0.15.0 上加载我的环境配置时遇到了同样的错误。我能够使用 python 解释器来纠正这个问题,它将注销在尝试加载您的环境时遇到的任何错误。只要你的环境变量加载成功,load_dotenv() 就会返回True

对我来说,是我的配置文件的问题(语法错误)破坏了加载过程。我需要做的就是转到我的环境变量配置文件并修复损坏的语法..

在加载环境变量(从 python 的解释器)时尝试传递 verbose=True 以从 load_dotenv 获取更多信息。

【讨论】:

    【解决方案2】:
    我遇到了类似的问题,发现了这三个可能的解决方案/原因:
    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)
    

    [编辑]

    【讨论】:

      【解决方案3】:

      所以这花了我一段时间。我的 load_dotenv() 返回 True。

      我在一些不正确的记录后面有逗号。

      一旦我删除了逗号,变量就可以工作了。

      【讨论】:

        【解决方案4】:

        需要放完整路径,不接受~/...

        使用

        • os.path.expanduser('~/Documents/MY_PROJECT/.env')

        • 或:load_dotenv('/home/MY_USER/Documents/MY_PROJECT/.env')

        它会起作用的。

        或者您将代码编辑器中的当前工作目录更改为“.env”文件所在的位置(应该是项目文件夹)。

        或者您在代码编辑器的菜单中打开项目文件夹,这应该使项目文件夹成为当前工作目录。

        在 Linux 上,您还可以转到终端中的项目文件夹并从那里启动代码编辑器,例如输入 codium 或您在命令提示符中使用的任何内容。

        TL:DR

        引用其他答案

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

        这给了我检查工作目录的想法。

        当前工作目录

        os.getcwd() 给了我一个更靠树的文件夹。然后我将“.env”文件复制到该工作目录中,它就可以工作了。

        更改工作目录取决于您的代码编辑器。我使用的是 codium,它是 vscode 的开源版本,然后你可以关注例如Python in VSCode: Set working directory to python file's path everytime

        完整路径

        你也可以放完整路径。

        有趣的是,我来这里之前已经检查过了,但是我复制了你从终端获得的路径,以'~/Documents/MY_PROJECT 开头,它没有找到文件但也没有提醒,任何尝试过的环境变量都只是空 - 只是因为从未读取过“.env”文件本身。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-31
          • 1970-01-01
          • 2019-06-22
          • 2013-05-27
          • 2019-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多