依赖与环境的现代化之路:从 requirements.txt 到 Pipfile 与 pyproject.toml 的取舍与实战
当你能让项目在新机器“一键拉起”,你就从“写代码”走向“做产品”。包管理与环境复现,是 Python 工程化的关键分水岭。今天,我们把三种主流方案掰开揉碎:requirements.txt、Pipfile 以及 pyproject.toml,讲清优缺点、落地路径与团队级最佳实践,帮你把依赖变成可靠、可追溯、可复制的资产。
开篇引入
Python 从“简洁优雅”起步,发展出覆盖 Web、数据科学、自动化、AI 的庞大生态,它被称作“胶水语言”,因为它把复杂世界连接成可用的系统。多年项目里,我见过“依赖地狱”让团队反复重装、修补,也见过“声明式环境 + 锁定 + CI 校验”让交付变得从容。写这篇文章,是希望把路径和工具交给你,让每次 git clone
不再是赌博,而是确定的启动。
三种路径的定位与演进
-
requirements.txt:
- 定位: pip 的依赖列表,纯文本,简单直白。
- 优点: 标准且通用、学习成本低、与 pip 原生无缝。
- 不足: 不含项目元数据(名称、版本、入口)、无构建信息、易“漂移”、锁定弱(需要额外工具)。
-
Pipfile / Pipfile.lock(Pipenv):
- 定位: 以 Pipfile 声明依赖,Pipenv 负责解析与锁定。
- 优点: 开发/生产依赖分离、内置锁文件、命令友好。
- 不足: 生态热度下降、与现代打包规范割裂、与多工具协作不如 pyproject 顺畅。
-
pyproject.toml(Poetry/PDM/Flit 等):
- 定位: 官方规范承载项目元数据与构建配置的“单一事实源”。
- 优点: 标准化(声明式元数据)、工具无关、配合 lock 文件可复现、构建隔离、避免三处配置重复。
- 不足: 初学者初次上手有学习成本;工具各有子命令需要选择其一。
直觉总结:Web/纯 Python 项目,用 pip + 现代化锁定或直接上 pyproject;库开发与团队协作,推荐 pyproject;Pipfile 如在存量项目可继续,但不建议新项目首选。
关键差异一览(速查表)
维度 | requirements.txt | Pipfile(Pipenv) | pyproject.toml(Poetry/PDM 等) |
---|---|---|---|
职责 | 依赖列表 | 依赖声明 + 锁定 | 元数据 + 构建 + 依赖 + 锁定 |
锁定 | 弱(需 pip-tools/constraints) | 强(Pipfile.lock) | 强(poetry.lock/pdm.lock) |
构建/发布 | 需 setup.cfg/setup.py | 仍需额外构建配置 | 内置(PEP 517/518/621) |
工具生态 | 通用 | 绑定 Pipenv | 多工具可选(Poetry/PDM/Flit/uv) |
复现与 CI | 需配套策略 | 一体化 | 一体化且与规范一致 |
选择原则:是否要“标准元数据 + 一体化构建 + 可复现锁定”?如果答案是“要”,首选 pyproject.toml。
经典做法与现代方案:优缺点细讲
requirements.txt
-
优点:
- 简洁: 一行一个包名+版本,人人能读。
- 通用: 与 pip 原生兼容,几乎所有平台/CI 都支持。
- 灵活: 配合
-c constraints.txt
、分层文件(base/dev/prod)易管理。