pip freeze导出requirements.txt怎么用

文章导读
pip freeze 输出的是当前 Python 环境里所有已安装包及其精确版本,格式通常是「包名==版本」,把这个输出重定向到文件,就得到 requirements.txt。能不能直接用,关键看导出时的环境是否干净:在项目专用的虚拟环境里导出,结果基本可用;在系统 Python 或多个项目共用的全局环境里导出,会把与项目无关的包一起写进文件。
📋 目录
  1. A 先确认当前场景和目标
  2. B 按这个顺序处理
  3. C 改完后怎么验证
  4. D 容易忽略的边界
A A

pip freeze 输出的是当前 Python 环境里所有已安装包及其精确版本,格式通常是「包名==版本」,把这个输出重定向到文件,就得到 requirements.txt。能不能直接用,关键看导出时的环境是否干净:在项目专用的虚拟环境里导出,结果基本可用;在系统 Python 或多个项目共用的全局环境里导出,会把与项目无关的包一起写进文件。

适用场景是:在项目专用虚拟环境内,把当前能正常运行的依赖版本固定下来。操作顺序是:先确认解释器路径,再执行 python -m pip freeze > requirements.txt。验证方式是:检查每一行是否为「包名==版本」,是否混入 -e 本地路径行,并在一个临时虚拟环境里用 pip install -r 安装一遍。边界是:pip freeze 记录的是整个环境而不是直接依赖;跨平台、跨 Python 版本时,导出结果未必能装回。

先确认当前场景和目标

pip freeze 适合解决「我这个环境现在装了什么、怎么在别的机器上还原成一样的版本」这类问题。它不适合解决「我这个项目声明了哪些直接依赖」——后者要求你手写或由工具生成依赖清单,而 pip freeze 会把传递依赖一并列出,文件会长,也更难读。

动手前先确认三件事,避免导出的文件不能复现:

pip freeze导出requirements.txt怎么用
  • 当前用的是哪个解释器。多 Python 版本共存的机器上,pip 与 python 可能不是同一个环境,建议统一用 python -m pip 调用。
  • 环境类型。venv、conda、系统 Python 三种环境的包来源不同,conda 环境里用 conda 安装的包,pip freeze 通常看不到或看不全,需要结合环境确认。
  • 是否装了本地可编辑包(pip install -e)。这类包会以 -e 或本地路径形式出现在导出结果里,换一台机器就装不上。
python -m pip --version
python -c "import sys; print(sys.executable)"
python -m pip list --not-required

最后一条命令列出的是「不是其他包依赖的包」,可作为判断当前环境是否干净的参考;该参数需要较新的 pip 支持,如果报错,就用 pip list 人工看。若输出里出现大量与项目无关的包,先切换到虚拟环境再导出,而不是导出后再手工删。

按这个顺序处理

  1. 激活项目对应的虚拟环境,并用上面的命令确认 sys.executable 指向该环境。
  2. 导出到文件。文件名建议就用 requirements.txt,放在项目根目录。
  3. 过滤掉不该锁定的内容,例如本地可编辑安装、与运行无关的工具包。
  4. 打开文件通读一遍,再决定是否需要手工补注释或分组。
# 基础导出
python -m pip freeze > requirements.txt

# 排除可编辑安装的本地包
python -m pip freeze --exclude-editable > requirements.txt

# 在 Linux / macOS 上过滤掉打包工具类包
python -m pip freeze | grep -v -E "^(pip|setuptools|wheel)==" > requirements.txt

Windows 的 cmd 或 PowerShell 没有 grep,可以先用 python -m pip freeze 输出到屏幕,再人工删掉不需要的行,或者改用 python -m pip list --format=freeze > requirements.txt。pip list --format=freeze 通常只输出「包名==版本」形式,不会带 -e 行,但两种方式覆盖的包范围略有差异,选择哪种需要结合你环境里是否装了本地包来判断。

还原端的命令是 pip install -r requirements.txt,建议同样写成 python -m pip install -r requirements.txt,保证装进目标解释器。

pip freeze导出requirements.txt怎么用

改完后怎么验证

先做文件层面检查:文件里每一行都应是「包名==版本」,不应出现 -e、file://、git+ 之类的地址行;行数与前一步的包数量大致对得上;关键框架和驱动包(例如 web 框架、数据库驱动)确实在列表里。

# 粗略查看行数与可疑行
python -c "lines=open('requirements.txt').read().splitlines(); print(len(lines)); print([l for l in lines if l.startswith('-e') or '://' in l])"

# 在临时环境里试装
python -m venv /tmp/req-check
source /tmp/req-check/bin/activate
python -m pip install -r requirements.txt
python -m pip check

预期信号是:install 过程没有报错,pip check 输出「No broken requirements found.」这类提示。如果要在原来的机器上确认导出结果是否忠实,可以在临时环境中再次执行 python -m pip freeze,与 requirements.txt 比对,差异应当只来自 pip、setuptools 这类工具包。Windows 下激活临时环境的命令是 /tmp/req-check/Scripts/activate 对应的路径,按实际创建位置调整。

容易忽略的边界

  • 版本锁定粒度。pip freeze 固定的是精确版本,包括传递依赖。这在还原同一平台时是优点,但目标机器 Python 版本或操作系统不同时,个别带平台轮子的包可能找不到对应版本,此时需要人工放宽或替换,而不是直接套用。
  • 权限与环境污染。不要用系统 Python 或管理员权限往全局环境里反复安装来「测试」,建议始终新建临时虚拟环境验证,用完删除。
  • conda 环境混用。conda 装的包和 pip 装的包在同一环境里共存时,pip freeze 的覆盖面不完整,跨机器还原前需要确认关键包的安装来源。
  • 回退建议。导出前先备份已有的 requirements.txt(例如复制为 requirements.txt.bak);新文件装不上时,不要急着逐个手改版本,可以先确认是哪个包导致失败,再用 pip install 单独装该包定位问题,必要时退回备份文件继续排查。