Python 项目配置 requirements.txt 锁定依赖版本怎么做

文章导读
生产环境部署建议用 pip freeze 生成全量锁定文件,开发库维护建议只锁定直接依赖版本。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 进阶方案:使用 pip-tools 精确锁定
  5. 怎么验证是否生效
  6. 常见坑
A A

生产环境部署建议用 pip freeze 生成全量锁定文件,开发库维护建议只锁定直接依赖版本。

先说结论:锁定版本是为了确保环境一致性,不同场景做法不同,别混用。

  • 适合:生产部署、持续集成、复现旧项目
  • 先准备:干净的虚拟环境,确保没有多余包
  • 验收:在新环境中重新安装并运行测试

命令速用版

# 导出当前环境所有包及其版本
pip freeze > requirements.txt

# 根据文件安装依赖
pip install -r requirements.txt

注意:执行 freeze 前必须确保虚拟环境纯净,否则会把全局包也写进去。

为什么会这样

Python 依赖包经常更新,上游作者发布新版本可能会引入不兼容改动。如果不锁定版本,每次安装都可能拉到最新版,导致昨天能跑的代码今天报错。锁定版本就是把所有依赖的具体版本号写死,确保任何时间、任何机器安装的包都一样。

但要注意,pip freeze 会把依赖的依赖(子依赖)也写进去,这适合最终应用部署。如果你是在开发一个给别人用的库,锁死子依赖可能会限制使用者的环境,通常只需锁定直接依赖。

Python 项目配置 requirements.txt 锁定依赖版本怎么做

分步处理

1. 创建干净环境:不要在全局环境操作,先用 venv 或 virtualenv 隔离。

python -m venv venv
source venv/bin/activate  # Windows 用 venv\Scripts\activate

2. 安装项目依赖:先安装你明确需要的包,可以指定大版本范围,比如 requests==2.28.*。

3. 生成锁定文件:确认项目运行正常后,导出当前状态。

pip freeze > requirements.txt

4. 提交版本控制:把生成的 requirements.txt 加入 git,但不要提交 venv 目录。

5. 回滚准备:如果更新后出问题,确保 git 里保留了旧版本的 requirements.txt 以便回退。

Python 项目配置 requirements.txt 锁定依赖版本怎么做

进阶方案:使用 pip-tools 精确锁定

对于复杂项目,推荐使用 pip-tools 管理依赖。它允许你维护一个 requirements.in 存放直接依赖,然后编译生成 requirements.txt 锁定所有子依赖。

# 安装工具
pip install pip-tools

# 编写 requirements.in (只写直接依赖)
echo "requests" > requirements.in

# 编译生成锁定文件
pip-compile requirements.in

# 同步环境(卸载多余包,只保留锁定文件中的包)
pip-sync requirements.txt

怎么验证是否生效

最稳妥的方式是在一个全新的环境里测试。可以用 Docker 临时起一个容器,或者新建一个虚拟环境。

# 新建验证环境
python -m venv test_env
source test_env/bin/activate

# 安装锁定文件
pip install -r requirements.txt

# 检查版本是否一致 (跨平台方案)
# 方案 A: Windows CMD 使用 FC 命令
pip freeze > temp.txt
FC requirements.txt temp.txt

# 方案 B: Linux/Mac 或 Git Bash 使用 diff
pip freeze | diff requirements.txt -

# 方案 C: 使用 Python 脚本比对 (通用)
python -c "open('req.txt').read() == open('temp.txt').read()"

如果比对无差异,说明版本完全一致。同时运行项目的单元测试或启动命令,确认功能正常。

常见坑

1. 不要手动编辑 freeze 生成的文件:里面包含子依赖,手动改容易破坏依赖树,除非你清楚自己在做什么。

Python 项目配置 requirements.txt 锁定依赖版本怎么做

2. 注意操作系统差异:某些包在不同系统上版本可能不同,最好在目标系统或 Docker 里生成文件。

3. 区分应用和库:如果是开发库(library),不要提交 freeze 生成的全量文件,只写直接依赖;如果是应用(application),提交全量文件。

4. 私有源问题:如果用了内部 pip 源,确保部署环境也能访问,否则安装会失败。

5. 环境污染风险:如果在已安装很多包的环境中运行 freeze,requirements.txt 会包含无关包。务必在新建的 venv 中操作。