Python配置管理核心是解耦环境差异与配置内容,保障安全可维护;推荐YAML(分层加载+safe_load)、INI(section划分+环境变量注入)、JSON(跨语言+schema校验),并遵循分离、注入、校验三原则。
Python项目中配置管理的核心,是把环境差异(开发、测试、生产)和配置内容(数据库地址、API密钥、日志级别)解耦,同时保证安全性与可维护性。YAML、INI、JSON 各有适用场景,不追求统一格式,而要按需选择、分层加载、安全隔离。
YAML 语法简洁,天然支持嵌套、列表和注释,特别适合定义服务依赖、中间件参
数等层次化配置。推荐用 pyyaml 加载,并禁用危险的 load(),改用 safe_load() 防止代码执行风险。
常见做法是按环境拆分文件:
config/base.yaml:通用配置(如应用名、默认超时)config/development.yaml:本地调试用(启用 debug、mock 开关)config/production.yaml:线上配置(关闭 debug、设置真实 DB 地址)启动时通过环境变量指定加载哪一套,例如:ENV=production python app.py,再用 yaml.safe_load() 合并 base + 当前环境文件(注意:用 dict.update() 或 deepmerge 库处理嵌套覆盖)。
INI 格式简单,Windows 程序员熟悉,也常被运维脚本或旧版部署工具读取。Python 内置 configparser 模块即可解析,无需额外依赖。
建议用 section 划分逻辑模块:
[database] 下放 host/port/name[logging] 下放 level/format/file[feature] 下放开关类配置(如 enable_cache = true)注意:configparser 默认不支持嵌套或变量插值,若需动态值(如 log_path = /var/log/%(app_name)s),得手动调用 config.get('section', 'key') 并传入字典做替换;敏感字段(如密码)避免硬编码,应留空或用占位符,运行时由环境变量注入。
JSON 无注释、无注释、无注释(重要说三遍),但结构严格、解析快、所有语言原生支持。适合微服务间共享配置 Schema,或前端+后端共用同一份配置元数据(如 API 路由白名单、字段校验规则)。
使用建议:
json.load() 读取,配合 schema 库做格式校验(比如确保 port 是整数、timeout > 0)config.schema.json),供 CI 步骤自动校验配置合法性真正落地时,光有格式不够,关键在流程设计:
.gitignore),用模板文件(如 config/local.yaml.example)说明字段含义和默认值DATABASE_URL 存在时,直接覆盖 YAML 中的 database.url,方便 Docker/K8s 注入SECRET_KEY、REDIS_URL 是否非空,缺失则报错退出,不带病运行ansible-vault 或 aws ssm parameter-store 管理密钥,启动时动态拉取不复杂但容易忽略。