是否需在每个Python模块中运行load_dotenv()?变量读取异常排查
环境变量加载后模块访问不一致问题解答
问题场景
定义了内容为env=loc的.env文件,项目目录结构如下:
├── __init__.py ├── cli.py |── settings.py ├── commands │ ├── __init__.py │ └── output.py
各模块代码
settings.py:
from dotenv import load_dotenv import os # 注:原代码遗漏os模块导入,否则os.getenv会直接报错 load_dotenv() if not os.getenv("env"): raise TypeError("'env' variable not found in .env file")
commands/output.py:
import os def output(): return getenv("env") # 此处存在语法问题
cli.py:
import settings from commands.output import output import os CURR_ENV = os.getenv("env") print(CURR_ENV) print(output())
执行cli.py后输出:
loc None
疑问:为何output.py的输出不是loc?首次运行load_dotenv()时已加载环境变量。是否需要在每个需访问环境变量的模块中都运行load_dotenv()?
问题原因与解决办法
核心问题
output.py里的getenv("env")未指定所属模块——你已经导入了os模块,但调用方法时漏掉了os.前缀,导致Python认为你在调用一个未定义的本地函数,最终返回None,这和环境变量是否加载完全无关。
关于load_dotenv()的说明
load_dotenv()是全局生效的:一旦在任意模块执行该函数,整个Python进程的环境变量都会被更新,不需要在每个模块重复调用。你这里的settings.py已经执行了load_dotenv(),所有模块都能访问到加载后的环境变量,前提是代码调用正确。
修正方案
修改output.py的代码,补上os.前缀:
import os def output(): return os.getenv("env")
再次执行cli.py,输出就会变成:
loc loc
内容的提问来源于stack exchange,提问作者Vandit Goel
相关产品推荐
相关产品推荐

