.env
STAGING_BUCKET=our-staging-bucket
common.py(与.env在同一目录中(
import os
STAGING_BUCKET = os.getenv('STAGING_BUCKET')
print(STAGING_BUCKET)
当我们在本地运行气流项目时,我们会收到STAGING_BUCKET变量的不同值diff-staging-bucket
。我们最近将.env中的这个变量从diff-staging-bucket
更改为our-staging-bucket
。os.getenv('STAGING_BUCKET')
似乎正在获取全局保存的STAGING_BUCKET
变量,而不是.env文件中的变量,因为我们可以从主目录在python中本地运行此代码,并且仍然返回旧的diff-staging-bucket
。
我们如何解决这个问题,以便在这里接收正确的.env
变量
EDIT我从命令行运行了env
,是的,有一个全局STAGING_BUCKET变量是diff-staging-bucket
os.getenv
获取环境变量。在unix中,环境变量通常由shell命令设置,如export
或setenv
(取决于shell(。这些命令可能在shell init文件中,例如.bashrc
或.cshrc
CCD_ 15不是其中之一。你放在那个文件里的内容没有具体意义。它只是一个文件。与os.getenv
无关。
我想这种困惑来自于这样一个事实:在docker中(但你从来没有提到docker,无论是在你的问题中还是在任何标签中。我只是猜测,之前使用docker的经验是你错误地认为.env
包含环境变量的原因(,.ev文件用于设置插入生成的docker图像中的环境变量;从而在这些图像中存在这样的包含这些变量的bashrc
文件。但是,如果您的操作系统不是由docker-compose这样的工具生成的,那么从.env
这样的配置文件中,就没有理由期望os.getenv
知道.env
文件中有什么。
os.getenv
或os.environ.get
都会获得通常在内核中设置的环境变量。
但如果您有兴趣从.env
文件中读取环境变量,可以使用python-dotenv
包;它读取您在该文件中的配置:
首先,通过pip:安装
pip install python-dotenv
例如,您有foo.py,您想在其中读取.env
变量,其目录结构如下:
.
├── .env
└── foo.py
所以你的foo.py
模块应该是这样的:
from dotenv import load_dotenv
load_dotenv() # take environment variables from .env.
# Code of your application, which uses environment variables (e.g. from `os.environ` or
# `os.getenv`) as if they came from the actual environment.
参考:
上面的例子取自python dotenv文档;您可以在它的文档中找到更多关于这个包的其他用例的信息。