我有一个
.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() 吗?
这个答案或多或少重复了评论中提到的内容,并添加了一个演示示例。
一旦调用
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
中读取。