python包版本锁定的核心目标是保证环境一致性,避免依赖升级导致运行时错误;推荐用pip-tools通过requirements.in声明高层依赖、自动生成带哈希校验的requirements.txt,并支持分层环境管理与平台/版本条件依赖。

Python项目中包版本锁定的核心目标是保证环境一致性,避免因依赖升级导致的运行时错误。最常用且推荐的方式是结合 requirements.in(声明高层依赖)与 requirements.txt(锁定精确版本),再通过 pip-compile(来自 pip-tools)自动生成和更新。
用 pip-tools 实现可维护的版本锁定
直接手写 requirements.txt 并固定所有版本(如 requests==2.28.1)虽能锁定,但难以追踪间接依赖变更、无法自动解决冲突、也不支持条件依赖(如 typing-extensions; python_version )。pip-tools 提供了更可持续的方案:
- 在
requirements.in中只写顶层依赖(如requests、django>=4.2),不指定版本或仅用宽松约束 - 运行
pip-compile requirements.in,生成带完整依赖树和哈希校验的requirements.txt - 部署或 CI 中使用
pip install --require-hashes -r requirements.txt,强制校验完整性 - 升级单个包时,改
requirements.in后重新 compile,工具会智能更新其传递依赖
区分开发/生产环境依赖
不同环境需要的包不同(如测试用 pytest、代码检查用 black 不应进生产环境)。推荐分层管理:
-
requirements.in:仅放生产核心依赖 -
requirements-dev.in:以-r requirements.in开头,再追加开发专用包 - 分别运行
pip-compile生成requirements.txt和requirements-dev.txt - 避免在
setup.py或pyproject.toml中重复声明依赖,以防不一致
应对多 Python 版本与平台差异
某些包在不同 Python 版本或操作系统下行为不同(如 uvloop 仅限 Unix,pywin32 仅限 Windows)。pip-tools 支持环境标记:
立即学习“Python免费学习笔记(深入)”;
- 在
requirements.in中写:uvloop; platform_system != "Windows" - 或按 Python 版本控制:
dataclasses; python_version -
pip-compile编译时会保留这些标记,并在生成的requirements.txt中对应写出条件行 - 安装时 pip 自动跳过不匹配的条目,无需手动切换文件
CI/CD 与部署中的关键实践
锁定不是一劳永逸,需嵌入流程防止漂移:
- CI 流程中加入
pip-compile --check,校验requirements.txt是否由当前.in文件生成,避免手动修改被绕过 - Docker 构建时用
COPY requirements.txt .+pip install -r requirements.txt,利用层缓存提升速度 - 定期运行
pip-compile --upgrade更新依赖(建议配合 Dependabot 或 Renovate 自动 PR) - 禁止在部署脚本中执行
pip install -r requirements.txt之外的pip install操作,防止隐式引入未锁定包
不复杂但容易忽略:每次修改依赖后必须重新 compile 并提交新生成的 requirements.txt,否则锁定就失效了。









