为什么 os.environ.get() 不返回通过获取 .env 文件创建的变量,但 echo 可以找到它?



这是SO上经常被问到的一个罕见问题,但没有答案。我会再问一次,有点不同。

我试图使用一个文件设置一个环境变量,然后在python中读取该变量。这应该是非常基本的。

然而,看看这个:

$ cat .env.test
NAME=Bob
$ cat x.py
import os
print(os.environ.get("NAME"))
$ (source .env.test;  echo $NAME) 
Bob
$ (source .env.test;  python3 x.py)
None

这不是很奇怪吗?为什么它不起作用?

是因为我没有在.env文件中写入export如果我添加export,它确实有效但为什么?这不是source应该做的吗?

$ cat .env.test
export NAME=Bob
$ cat x.py
import os
print(os.environ.get("NAME"))
$ (source .env.test;  echo $NAME) 
Bob
$ (source .env.test;  python3 x.py)
Bob

我认为社区可以使用关于子shell如何工作、source如何工作以及python在哪里寻找环境变量的解释来一劳永逸地回答这个问题。你能做到吗?

相关问题

  • os.environ.get返回None,而终端返回正确的环境变量
  • 在烧瓶中,os.environment.get((返回None
  • Python os.environ.get未返回值

var=value不定义环境变量,除非定义了选项set -a默认情况下,它只定义一个shell变量

未导出的shell变量不存在exec()边界——也就是说,当您启动一个新的可执行文件时,只有环境变量存在。


要导出从文件中来源的所有变量,请在来源之前启用set -ashell选项,如如何从.env文件设置环境变量:中所述

$ (set -a; source .env.test; exec python3 x.py)

在上面的例子中,我们不需要关闭set -a,因为它的作用域是在)被命中时退出的子shell,甚至在命中之前,因为我们可以使用exec告诉子shell用Python替换自己,而无需再次分叉。

对于更一般的情况,当在将要继续运行一段时间的脚本中使用它时,它会看起来像:

set -a            # enable auto-export
source .env.test  # source file content
set +a            # disable auto-export

最新更新