猿问

Python 忽略源 .env 文件

source .env尽管可以从 bash 访问这些变量,但我对 Python 不访问这些变量的意义和原因感到困惑。


当我手动时export FOO=foo,Python 会看到环境,但当我source .env


$ cat .env 

ENV=development

$ echo $ENV


$ echo $FOO


$ source .env 

$ export FOO=foo

$ echo $ENV

development

$ echo $FOO

foo

$ python3

Python 3.7.7 (default, Mar 10 2020, 15:43:27)

[Clang 10.0.0 (clang-1000.11.45.5)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import os

>>> print(os.getenv("ENV"))

None

>>> print(os.getenv("FOO"))

foo


ABOUTYOU
浏览 95回答 2
2回答

慕仙森

我对 source .env 的重要性感到困惑source就像其他语言中的“include”一样工作,就像在 C 中一样,它包含其他文件的内容。source只是解析来自其他文件的文本,就好像它会被输入一样。为什么 Python 不访问这些变量,尽管这些变量可以从 bash 访问。因为没有导出变量,所以在创建python进程的执行环境时,该环境中不包含该变量的值。那么我如何轻松地导出 .env 文件中的所有键值变量呢?添加export到文件中的每个变量.env,或用于set -a导出所有变量,然后获取文件,或者解析.env文件以提取变量名称,并使用 设置每个变量的导出属性export。

呼唤远方

正如 KamilCuk 所说,source没有必要“导出”。必须导出变量,而不仅仅是源,所以在我的例子中,我只需要export ENV=development在.env文件和源中。注意在这种情况.env下第 2 行是不同的。$ cat .env export ENV=development$ echo $ENV$ echo $FOO$ source .env $ export FOO=foo$ echo $ENVdevelopment$ echo $FOOfoo$ python3Python 3.7.7 (default, Mar 10 2020, 15:43:27) [Clang 10.0.0 (clang-1000.11.45.5)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> import os>>> print(os.getenv("ENV"))development>>> print(os.getenv("FOO"))foo并且添加到这一点,当我这样做时export FOO=foo,这既分配又出口,但实际上如果你只是做下面的事情,你会创建一个没有出口的 bash var。$ FOO=foo$ echo $FOOfoo在这种情况下,它是assigned,但不是exported。Python 需要将其导出。
随时随地看视频慕课网APP

相关分类

Python
我要回答