os.getenv()加载了错误的变量,而不是.env中的变量



.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-bucketos.getenv('STAGING_BUCKET')似乎正在获取全局保存的STAGING_BUCKET变量,而不是.env文件中的变量,因为我们可以从主目录在python中本地运行此代码,并且仍然返回旧的diff-staging-bucket

我们如何解决这个问题,以便在这里接收正确的.env变量

EDIT我从命令行运行了env,是的,有一个全局STAGING_BUCKET变量是diff-staging-bucket

os.getenv获取环境变量。在unix中,环境变量通常由shell命令设置,如exportsetenv(取决于shell(。这些命令可能在shell init文件中,例如.bashrc.cshrc

CCD_ 15不是其中之一。你放在那个文件里的内容没有具体意义。它只是一个文件。与os.getenv无关。

我想这种困惑来自于这样一个事实:在docker中(但你从来没有提到docker,无论是在你的问题中还是在任何标签中。我只是猜测,之前使用docker的经验是你错误地认为.env包含环境变量的原因(,.ev文件用于设置插入生成的docker图像中的环境变量;从而在这些图像中存在这样的包含这些变量的bashrc文件。但是,如果您的操作系统不是由docker-compose这样的工具生成的,那么从.env这样的配置文件中,就没有理由期望os.getenv知道.env文件中有什么。

os.getenvos.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文档;您可以在它的文档中找到更多关于这个包的其他用例的信息。

最新更新