在Linux中未使用load_dotenv()加载环境变量

zpgglvta  于 2022-12-11  发布在  Linux
关注(0)|答案(5)|浏览(241)

我尝试创建一个discord bot,当我尝试使用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)

以及保存.env文件:(假令牌)

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

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

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

但那也不管用

zi8p0yeb

zi8p0yeb1#

我也遇到过类似的问题,并找到了以下三种可能的解决方案/原因:

1.检查.env文件中的语法是否正确,原始文档将是最好的源代码-Python Dotenv(示例如下)

DOMAIN=example.org
 ADMIN_EMAIL=admin@${DOMAIN}
 ROOT_URL=${DOMAIN}/app

1.对我有效的解决方案是使用find_dotenv()而不是load_dotenv()中的文件路径,原因是load_dotenv()不能正确加载.env文件。find_dotenv()是一个自动查找.env文件的函数,如果它与您的代码文件位于同一个文件夹中。

from dotenv import load_dotenv, find_dotenv

 load_dotenv(find_dotenv())

1.您可以使用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)

[已编辑]

2exbekwf

2exbekwf2#

我在ubuntu 20.04和python-dotenv 0.15.0上加载我的环境配置时也遇到了同样的错误。我可以使用python解释器来纠正这个错误,它会注销在加载环境时遇到的任何错误。每当环境变量加载成功时,load_dotenv()都会返回True
对我来说,是我的配置文件的一个问题(语法错误)破坏了加载过程。我所需要做的就是转到我的环境变量配置文件并修复损坏的语法。
尝试在加载环境变量(从python的解释器)时传递verbose=True,以从load_dotenv获取更多信息。

wbgh16ku

wbgh16ku3#

您需要输入完整路径。
用途

  • 或者os.path.expanduser('~/Documents/MY_PROJECT/.env')
  • 或:load_dotenv('/home/MY_USER/Documents/MY_PROJECT/.env')

它会起作用的。
或者在代码编辑器中将当前工作目录更改为.“env”文件所在的位置(应该是项目文件夹)。
或者在代码编辑器的菜单中打开项目文件夹,这应该会使项目文件夹成为当前工作目录。
在Linux上,您还可以转到终端中的项目文件夹,并从那里启动代码编辑器,例如键入codium或在命令提示符中使用的任何内容。

TL:DR

引用其他答案

由于我将.env文件移到了另一个子文件夹config中,因此我必须提供load_dotenv()的完整路径才能使其正常工作。
这给了我检查工作目录的想法。

当前工作目录

os.getcwd()给了我一个更靠上的文件夹。然后我把“.env”文件复制到那个工作目录中,它就工作了。
改变工作目录取决于你的代码编辑器。我使用codium,它是vscode的开源版本,那么你可以遵循例如Python in VSCode: Set working directory to python file's path everytime

完整路径

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

m0rkklqb

m0rkklqb4#

所以这花了我一段时间。我的load_dotenv()返回True。
我在一些记录后有逗号,这是不正确的。
一旦我去掉了逗号,变量就开始工作了。

9lowa7mx

9lowa7mx5#

我讷讷:
variable = '变数'
将其更改为:
variable=变量
已修复此问题.(删除空格,删除“”)

相关问题