一个工程化的 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。

我的实践

  1. 小脚本:直接 os.environ + .env。
  2. 中等项目:Pydantic Settings + .env。
  3. 训练实验:Hydra 或 OmegaConf 做配置组合。
  4. 生产部署:12-factor,配置全部走环境变量,密钥交给云服务。