Python dotenv 库 load_dotenv() 使用指南
在开发 Python 项目时,常面临数据库密码、API 密钥泄露风险,以及多环境配置切换困难等问题。load_dotenv() 来自 python-dotenv 库,是一个轻量级工具函数,用于从 .env 文件中读取键值对,并注入到操作系统的环境变量中。它让敏感配置与代码彻底分离,是现代 Python 项目的标准实践。
核心价值
- 避免敏感信息泄露(配合
.gitignore) - 无缝切换多环境配置(dev/staging/prod)
- 团队协作零冲突
- 部署更安全(生产环境变量由运维管理)
快速上手
1. 安装库
pip install python-dotenv
2. 创建 .env 文件(项目根目录)
# .env
DEBUG=True
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
API_KEY=sk-xxxxxx-secret-key
SECRET_KEY=your-django-secret-key-here
PORT=8000
命名规范:全大写 + 下划线,值含空格需加引号(如 NAME="John Doe")。
3. 在代码中加载并使用
from dotenv import load_dotenv
import os
# 加载 .env 文件(默认当前目录)
load_dotenv()
# 安全获取变量(推荐使用 os.getenv)
# 环境变量值永远是字符串类型,需要处理后返回布尔类型
debug_mode = os.getenv("DEBUG", "False") == "True"
api_key = os.getenv("API_KEY")
port = int(os.getenv("PORT", 5000)) # 提供默认值防崩溃
print(f"服务运行在端口:{port}")
进阶技巧
指定自定义路径
load_dotenv(dotenv_path=".env.production") # 加载生产环境配置
强制覆盖已有变量(override=True)
load_dotenv(override=True) # 覆盖系统已存在的同名环境变量
框架集成示例
Django(settings.py 顶部):
from dotenv import load_dotenv
load_dotenv(os.path.join(BASE_DIR, '.env'))
Flask(app.py 开头):
from dotenv import load_dotenv
load_dotenv() # 必须在创建 app 前调用
from flask import Flask
app = Flask(__name__)
自动查找(无需指定路径)(verbose=True)
load_dotenv(verbose=True) # 自动向上级目录查找 .env
安全与最佳实践
| 实践 | 说明 |
|---|---|
| ✅ .gitignore 必加 | 将 .env 加入 .gitignore,防止误提交 |
| ✅ 提供 .env.example | 创建模板文件供团队参考(不含真实值) |
| ✅ 验证必填变量 | 启动时检查关键变量是否存在 |
| ❌ 禁止提交真实 .env | 尤其是含密码/密钥的文件 |
| 🌐 生产环境慎用 | 云平台(如 Heroku/AWS)应通过控制台设置环境变量 |
.gitignore 示例:
# 敏感配置文件
.env
.env.local
.env.production
.env.example 模板示例:
# 复制为 .env 并填入实际值
DATABASE_URL=your_database_url_here
API_KEY=your_api_key_here
DEBUG=False
常见问题排查
| 问题 | 解决方案 |
|---|---|
| 加载后仍取不到值 | 检查:1. .env 路径是否正确 2. 变量名大小写 3. 是否在 load_dotenv() 后调用 os.getenv() |
| 中文乱码 | 保存 .env 为 UTF-8 编码 |
| 变量含空格/特殊字符 | 用引号包裹:MSG="Hello World!" |
| Docker 中不生效 | 确保 .env 被 COPY 进镜像,或使用 --env-file 参数 |
为什么它如此重要?
'配置即代码'是 DevOps 黄金准则。load_dotenv() 以极简设计践行了 12-Factor App 原则中的 III. Config:
'将配置存储于环境变量中,与代码严格分离。'
它不仅是工具,更是一种工程素养的体现——保护用户数据、提升协作效率、筑牢安全防线。

