在开发 Python 项目时,配置管理往往是个痛点。数据库密码、API 密钥如果硬编码在代码里,一旦提交到 GitHub 就可能泄露;本地、测试和生产环境的配置切换也容易导致混乱。load_dotenv() 来自 python-dotenv 库,是一个轻量级工具函数,用于从 .env 文件中读取键值对,并注入到操作系统的环境变量中。它让敏感配置与代码彻底分离,是现代 Python 项目的标准实践。
核心优势
- 避免敏感信息泄露:配合
.gitignore防止误提交。 - 多环境无缝切换:轻松管理 dev/staging/prod 配置。
- 团队协作零冲突:统一配置入口,减少硬编码修改。
- 部署更安全:生产环境变量由运维或云平台控制台管理。
快速上手
1. 安装依赖
pip install python-dotenv
2. 创建 .env 文件
在项目根目录创建一个名为 .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
3. 加载并使用
在代码入口处调用 load_dotenv(),之后通过 os.getenv() 获取变量。需要注意的是,环境变量值永远是字符串类型,需要自行处理类型转换。
from dotenv import load_dotenv
import os
# 加载.env 文件(默认当前目录)
load_dotenv()
# 安全获取变量
debug_mode = os.getenv("DEBUG", "False") == "True"
api_key = os.getenv("API_KEY")
port = int(os.getenv("PORT", 5000))
print(f"服务运行在端口:{port}")
进阶用法
指定自定义路径
如果你的 .env 文件不在项目根目录,可以指定路径:
load_dotenv(dotenv_path=".env.production")
强制覆盖已有变量
系统已存在的同名环境变量默认不会被覆盖,设置 override=True 可强制更新:
load_dotenv(override=True)
框架集成示例
Django (settings.py 顶部):
from dotenv import load_dotenv
import os
load_dotenv(os.path.join(BASE_DIR, '.env'))
Flask (app.py 开头):
from dotenv import load_dotenv
from flask import Flask
# 必须在创建 app 前调用
load_dotenv()
app = Flask(__name__)
自动查找
开启 verbose=True 后,会自动向上级目录查找 .env 文件,适合嵌套项目结构。
安全与最佳实践
| 实践 | 说明 |
|---|---|
| ✅ .gitignore 必加 | 将 .env 加入忽略列表,防止误提交 |
| ✅ 提供 .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
常见问题排查
- 加载后仍取不到值:检查
.env路径是否正确,变量名是否区分大小写,确保在load_dotenv()之后调用os.getenv()。 - 中文乱码:保存
.env文件时确保使用 UTF-8 编码。 - 变量含空格/特殊字符:用双引号包裹,例如
MSG="Hello World!"。 - Docker 中不生效:确保
.env被 COPY 进镜像,或使用--env-file参数。
结语
遵循'配置即代码'的 DevOps 准则,load_dotenv() 以极简设计践行了 12-Factor App 原则中的配置分离理念。只需几分钟,为你的项目添加 .env 管理和 .gitignore 保护,安全性和可维护性将迈上新台阶。

