使用python-dotenv时环境变量返回None的问题排查
为什么python-dotenv无法读取环境变量?
我来帮你排查下这个问题,通常遇到load_dotenv()后os.getenv()返回None的情况,大概率是以下几个常见原因之一:
1. .env文件路径未正确定位
load_dotenv()默认会在当前工作目录下寻找.env文件,但如果你运行脚本的目录不是.env和settings.py所在的目录,就会找不到目标文件。比如你在父目录执行python3 subfolder/settings.py,此时当前工作目录是父目录,自然读不到子文件夹里的.env。
解决方法:用脚本自身的路径来定位.env,确保无论在哪里运行都能找到它:
import os from dotenv import load_dotenv from pathlib import Path # 获取当前脚本所在目录的.env路径 env_file_path = Path(__file__).parent / ".env" load_dotenv(dotenv_path=env_file_path) test_var = os.getenv("TEST_VAR") print(test_var)
你也可以直接传入.env的绝对路径(比如/home/yourname/project/.env),不过用__file__的方式更灵活,适合项目迁移。
2. .env文件格式有误
检查你的.env文件是否符合格式要求:
- 变量名和值之间不要加空格,比如不要写成
TEST_VAR = jkh45k3j4h5k34j,应该是TEST_VAR=jkh45k3j4h5k34j(等号前后无空格) - 如果值包含空格或特殊字符,才需要用引号包裹,比如
TEST_VAR="hello world",纯字符串不需要额外加引号 - 确保文件没有多余的空行或无效注释(注释需要用
#开头)
3. python-dotenv未正确安装
虽然你的脚本没有报错,但也有可能是库安装到了错误的Python环境里。可以在终端执行以下命令确认:
pip3 list | grep python-dotenv
如果没有输出,说明没安装,执行pip3 install python-dotenv重新安装即可。
4. 系统环境变量覆盖
极端情况下,如果系统中已经存在同名的TEST_VAR环境变量,且值为空或None,os.getenv()会优先读取系统环境变量。你可以在脚本里先打印所有环境变量排查:
print(os.environ)
看看有没有TEST_VAR的条目,再判断是否是被覆盖的问题。
内容的提问来源于stack exchange,提问作者user196286




