这里有一个很少见的问题,被问了很多次,但没有答案。我再问一次,有点不同。
我试图使用文件设置一个环境变量,然后在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
这不奇怪吗?为什么不动呢?
是因为我没有在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在哪里寻找环境变量,来一劳永逸地回答这个问题。你能做到吗?
相关问题
发布于 2022-09-24 14:40:07
除非定义了选项var=value
,否则set -a
不会定义环境变量。默认情况下,它只定义一个shell变量。
非导出的shell变量不能在exec()
边界中存活--也就是说,当您启动一个新的可执行文件时,只有环境变量才能存活。
若要导出从文件中获取的所有变量,请在获取之前启用set -a
外壳选项,如How to set environment variables from .env file中所述
$ (set -a; source .env.test; exec python3 x.py)
在上述情况下,我们不需要关闭set -a
,因为它的作用域是在)
被击中时退出的子subshell -甚至在此之前--因为我们可以使用exec
告诉子subshell使用exec
替换自己,而不需要再次分叉。
对于更一般的情况,当在将继续运行一段时间的脚本中使用它时,它应该是这样的:
set -a # enable auto-export
source .env.test # source file content
set +a # disable auto-export
https://stackoverflow.com/questions/73838019
复制相似问题