首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么os.environ.get()不返回通过查找.env文件而创建的变量,但是echo可以找到它?

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

Stack Overflow用户
提问于 2022-09-24 14:33:43
回答 1查看 176关注 0票数 0

这里有一个很少见的问题,被问了很多次,但没有答案。我再问一次,有点不同。

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

但是,请查看以下内容:

代码语言:javascript
运行
复制
$ 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应该做的吗?

代码语言:javascript
运行
复制
$ 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在哪里寻找环境变量,来一劳永逸地回答这个问题。你能做到吗?

相关问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-24 14:40:07

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

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

若要导出从文件中获取的所有变量,请在获取之前启用set -a外壳选项,如How to set environment variables from .env file中所述

代码语言:javascript
运行
复制
$ (set -a; source .env.test; exec python3 x.py)

在上述情况下,我们不需要关闭set -a,因为它的作用域是在)被击中时退出的子subshell -甚至在此之前--因为我们可以使用exec告诉子subshell使用exec替换自己,而不需要再次分叉。

对于更一般的情况,当在将继续运行一段时间的脚本中使用它时,它应该是这样的:

代码语言:javascript
运行
复制
set -a            # enable auto-export
source .env.test  # source file content
set +a            # disable auto-export
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73838019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档