我们需要在每个模块中运行load_dotenv()吗?

问题描述 投票:0回答:1

我有一个

.env
定义了以下内容:

env=loc

我有三个使用此变量的 python 模块。

├── __init__.py
├── cli.py
|── settings.py
├── commands
│   ├── __init__.py
│   └── output.py

settings.py:

from dotenv import load_dotenv

load_dotenv()

if not os.getenv("env"):
    raise TypeError("'env' variable not found in .env file")

output.py:

import os

def output():
  return getenv("env")

cli.py

import settings
from commands.output import output
import os

CURR_ENV = getenv("env") 
print(CURR_ENV)
print(output())

输出:

loc 
None

为什么

output.py
的输出不是loc?第一次运行 load_dotenv() 时加载环境变量。

每次需要访问环境变量时都必须运行 load_dotenv() 吗?

python python-3.x dotenv
1个回答
0
投票

这个答案或多或少重复了评论中提到的内容,并添加了一个演示示例。

一旦调用

load_dotenv()
,从那时起,环境变量将在调用它的进程(以及任何子进程)中可见。

假设您有一个组织如下的项目。

├── commands
│   ├── __init__.py
│   └── output.py
├── __init__.py
├── .env
├── main.py
|── settings.py

settings.py

from os import getenv

print("From settings.py:", getenv("env"))

output.py

from os import getenv

def output():
  print("From output.py:", getenv("env"))

output()

main.py

from os import getenv
from dotenv import load_dotenv
import settings                     # <-- settings don't see .env yet
from commands.output import output  # <-- output don't see .env yet
load_dotenv()                       # <-- because load_dotenv is called here

print("From main.py:", getenv("env"))
output()            # <--- the function call is made after load_dotenv(), so .env is visible

因此,如果您在 CLI 中运行

main.py
,您将获得以下输出。

PS path\to\module> python .\main.py
From settings.py: None
From output.py: None
From main.py: loc
From output.py: loc

要使 .env 随处可见,请将

load_dotenv
逻辑移至
main.py
中的任何导入之前,或者在第一个导入中调用
load_dotenv
(在本例中为
settings.py
)而不是
main.py
,因为每个
settings.py
中的行将在导入后被读取,因此其中的每个导入和函数调用无论如何都会在
main.py
中读取。

© www.soinside.com 2019 - 2024. All rights reserved.