PyYAML:Python 生态中处理 YAML 配置的首选工具

Python 开发者几乎没有不知道 PyYAML 的。这个库在 GitHub 上获得了 2,899 个 Star,是 Python 世界里处理 YAML 格式的事实标准。YAML 本身在 DevOps、CI/CD、Docker Compose、Kubernetes 编排文件里几乎无处不在,要做配置管理就绕不开它。

正文顶部截图

为什么需要 PyYAML

Python 标准库没有内置 YAML 支持。在 PyYAML 出现之前,开发者只能用 JSON 凑合配置文件。但 JSON 写配置有两个硬伤:不能写注释,语法太严格。团队协作里,配置文件里没有注释解释参数含义,过两周自己都看不懂。而 YAML 的设计目标就是让人类读写舒服,缩进代替花括号,支持注释,字符串多数情况不用引号。

Ansible、SaltStack、Home Assistant 这些知名 Python 项目,底层都用 PyYAML 解析配置文件。它已经成了 Python 配置管理生态的底层基础设施。

安装和基本用法

安装没有复杂依赖,pip 直接装。如果你需要更快的解析速度,可以启用 LibYAML 绑定。LibYAML 是用 C 语言写的 YAML 解析器,PyYAML 利用它来加速 load 和 dump 操作。

启用 LibYAML 之后,加载和导出 YAML 可以使用 CLoader 和 CDumper:

yaml.load(stream, Loader=yaml.CLoader)
yaml.dump(data, Dumper=yaml.CDumper)

对于不信任来源的 YAML 输入,使用 yaml.safe_load 是更安全的选择。这是 PyYAML 在安全方面做的一个重要区分:yaml.load 可以反序列化任意 Python 对象,可能被恶意 YAML 文件利用;safe_load 则只支持基础的 Python 类型,杜绝了代码注入风险。

性能和场景

加上 LibYAML 绑定的 PyYAML 在解析大文件时,速度能提升数倍。对于需要频繁读写 YAML 的场景,比如 CI 流水线里的配置生成、日志格式化输出,这个提升很实在。

README区域截图

兼容性和维护

PyYAML 最早由 Kirill Simonov 开发,现在由 YAML 和 Python 社区共同维护。项目采用 MIT 协议,商业使用完全免费。

这个项目的研发节奏偏保守,功能迭代不快。Python 社区里也有声音说它更新太少,YAML 1.2 规范的支持一直没跟上。但从另一个角度看,接口稳定对配置文件解析场景本身就是价值。你不会希望每次更新依赖之后,之前能正常读取的 YAML 文件突然报错。

测试方面,PyYAML 自带完整的测试套件,运行 python setup.py test 即可验证安装是否正确。

适用场景和替代方案

如果你的 Python 项目需要读写 YAML 文件,PyYAML 是默认选择。它覆盖了 YAML 1.1 规范的主要特性,日常开发完全够用。

需要 YAML 1.2 规范支持的话,可以看社区里较新的替代库。需要更高性能的话,也有纯 Rust 实现的方案可以选。但对绝大多数配置管理、数据序列化场景,PyYAML 的表现足够可靠。Ansible 整个自动化引擎都跑在它上面,这就是最好的证明。

YAML 的表现足够可靠。Ansible 整个自动化引擎都跑在它上面,这就是最好的证明。

更多推荐