这是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 -a
shell选项,如如何从.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