一个工程化的 Python 项目往往要处理多种配置:数据库连接、API 密钥、模型超参、 不同的运行环境(开发/测试/生产)。本文整理几种常见方案的取舍。
1. 环境变量(最基础)
用 os.environ 读取,简单但弱类型、不便管理。
import os
DB_URL = os.environ.get("DATABASE_URL", "sqlite:///dev.db")
2. .env 文件 + python-dotenv
把环境变量写进 .env,开发时方便切换。
一定要把 .env 加进 .gitignore。
# .env
DATABASE_URL=postgres://...
SECRET_KEY=xxx
3. YAML/JSON/TOML 配置文件
适合结构化配置,比如 ML 训练的超参。
# config.yaml
model:
name: resnet50
lr: 0.001
batch_size: 64
data:
train: data/train
val: data/val
4. Pydantic Settings(推荐)
类型安全 + 自动校验 + 多来源合并(env > file > default)。 新项目强烈推荐。
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
db_url: str
secret_key: str
debug: bool = False
class Config:
env_file = ".env"
settings = Settings()
5. 密钥管理
永远不要把密钥写进代码、配置文件、git。
团队项目用 Vault / AWS Secrets Manager / GCP Secret Manager;
个人项目至少用 .env 并加 .gitignore。
如果密钥曾经提交到 git,立刻 rotate(重新生成)并清理 git history。
我的实践
- 小脚本:直接
os.environ+.env。 - 中等项目:Pydantic Settings +
.env。 - 训练实验:
Hydra或OmegaConf做配置组合。 - 生产部署:12-factor,配置全部走环境变量,密钥交给云服务。