【问题标题】:Export variables from .env file and get them from os.environ without python-dotenv从 .env 文件导出变量并在没有 python-dotenv 的情况下从 os.environ 获取它们
【发布时间】:2023-02-23 22:15:00
【问题描述】:
我想在我的 python 脚本中使用几个环境变量。我创建了 .env 文件:
TEST='test'
然后创建main.py:
import os
print(os.getenv("TEST"))
print(os.environ['TEST'])
在同一目录中执行:
$ source .env
$ echo $TEST
test
然后运行:
$ python3 main.py
None
Traceback (most recent call last):
File "/Users/me/temp/pt/main.py", line 3, in <module>
print(os.environ['TEST'])
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/os.py", line 679, in __getitem__
raise KeyError(key) from None
KeyError: 'TEST'
为什么在这种情况下os.getenv 不起作用,并且仅在export TEST=test 执行后或使用python-dotenv 模块后才起作用?
【问题讨论】:
标签:
python
environment-variables
【解决方案1】:
TL;DR 不要使用 source 来处理 dotenv 文件;它们不是 shell 脚本。
直接的问题是 source 不出口文件定义的任何变量;您只是定义了不会出现在新 Python 进程环境中的常规 shell 变量。
您可以通过启用 -a 选项自动导出文件中定义的任何变量来解决这个问题。
$ set -a
$ source .env
$ python3 main.py
test
test
然而,这里更大的问题是.env文件是不是外壳脚本。 dotenv后面的引用规则不同。比较:
$ cat .env
TEST=test echo hello
$ cat main.py
import os
import dotenv
x = dotenv.dotenv_values('.env')
print(os.getenv("TEST"))
print(x['TEST'])
$ set -a
$ source .env
hello
$ python3 main.py
None
test echo hello
源文件没有定义变量TEST;相反,它执行忽略 TEST 的值的 echo 命令仅为它是环境。
使用dotenv 处理文件会生成一个名为TEST 的变量,并将其设置为完整的字符串test echo hello。