os.environ vs python-dotenv vs pydantic-settings环境变量管理
Python有多种环境变量管理方式。请对比os.environ原生方式、python-dotenv加载.env文件、以及pydantic-settings统一配置管理三者的优缺点、使用场景和正确实践。
回答
古法程序员
1. os.environ(原生方式)
import os
# 读取(不存在时返回None)
db_host = os.environ.get('DB_HOST', 'localhost')
# 设置
os.environ['MY_VAR'] = 'value'
优点:标准库,零依赖 缺点:
- 所有值都是字符串,需手动类型转换
- 无验证机制
- 无默认值管理(需手动判断)
- 不自动加载.env文件
2. python-dotenv(.env文件加载)
from dotenv import load_dotenv
# 加载.env文件到os.environ
load_dotenv('.env')
load_dotenv('.env.local', override=True) # 覆盖已有值
优点:
- 简单、专注于.env文件
- 适合小项目和快速原型
- 支持多.env文件覆盖
缺点:
- 仍需要手动类型转换
- 无验证/校验能力
- 需额外安装
3. pydantic-settings(推荐)
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
db_host: str = 'localhost'
db_port: int = 5432
debug: bool = False
settings = Settings()
优点:
- 自动类型转换(str→int/bool/URL)
- 内建验证(Field约束、URL DSN验证)
- 自动加载.env文件
- 嵌套配置支持
- IDE类型提示支持
对比总结
| 维度 | os.environ | python-dotenv | pydantic-settings |
|---|---|---|---|
| 依赖 | 无 | 需安装 | 需安装 |
| 类型安全 | ❌ | ❌ | ✅ |
| 验证 | ❌ | ❌ | ✅ |
| .env加载 | ❌ | ✅ | ✅ |
| 嵌套结构 | ❌ | ❌ | ✅ |
| 适用场景 | 脚本/小工具 | 小型项目 | 中大型项目/API |
最佳实践:
- 简单脚本:
os.environ.get() - 小型项目:
python-dotenv - 生产项目推荐:
pydantic-settings