pipreqs比pip freeze更适合项目依赖分析,因为它只扫描源码import语句提取真实引用的包,避免混入开发依赖;但无法识别动态导入、条件导入和隐式依赖,需人工核验补全。

pipreqs 为什么比 pip freeze 更适合项目依赖分析
因为 pip freeze 输出的是当前 Python 环境中所有已安装包的完整列表,而 pipreqs 只扫描项目源码里的 import 语句,提取真正被代码直接引用的包。这对隔离环境、CI 构建或迁移旧项目特别有用——避免把开发时顺手装的 black、jupyter 也写进 requirements.txt。
但要注意:pipreqs 不解析动态导入(如 importlib.import_module("xxx"))、不识别字符串形式的包名、也不处理条件导入(if sys.version_info > (3, 8): import tomllib),这些都得手动补。
运行 pipreqs 前必须确认的三件事
否则生成的 requirements.txt 很可能漏包或报错:
- 项目目录下不能有未提交的 .py 文件残留(比如临时测试脚本),它们会被一并扫描,导致无关依赖混入
- 确保所有真实使用的第三方模块都已安装到当前环境(
pipreqs不检查是否可导入,只查 import 行;如果某import requests出现在代码里但 requests 没装,它仍会写进结果,但后续pip install -r会失败) - 若项目含子包(如
myproject/utils/),需确认__init__.py存在且路径结构清晰;否则pipreqs可能因无法解析相对导入而跳过部分文件
常用命令与关键参数取舍
pipreqs 默认行为是递归扫描当前目录下所有 .py 文件,并生成 requirements.txt。但实际中这几个参数几乎必用:
模板驱动的多平台内容流水线,面向独立 iOS 开发者,自动生成并排期一周的社交媒体帖子(TikTok、YouTube Shorts、X/Twitter...)
立即学习“Python免费学习笔记(深入)”;
-
--encoding=utf-8:中文注释或路径含中文时防止报UnicodeDecodeError -
--force:覆盖已存在的requirements.txt(默认不覆盖,容易误以为更新成功) -
--ignore=tests,migrations,venv:排除测试、数据库迁移、虚拟环境等目录(逗号分隔,不加空格) -
--diff=requirements.in:对比现有requirements.in,只输出新增依赖(适合 Pipenv/uv 风格工作流)
示例命令:
pipreqs . --encoding=utf-8 --force --ignore=tests,scripts --diff=requirements.in
生成后必须人工核验的三个位置
pipreqs 生成的清单不是终点,而是起点:
- 检查是否有包版本为空(如
requests而非requests==2.31.0):这说明pipreqs无法推断版本,需结合pip show requests或项目历史记录补全 - 确认
typing-extensions、importlib-metadata这类仅在旧 Python 版本需要的兼容包是否遗漏——pipreqs不读取python_requires字段 - 查看
requirements.txt里是否混入了-e .或本地路径包(它不支持解析setup.py或pyproject.toml中的install_requires,这类依赖需单独维护)
最常被忽略的是:某些包通过 from pkg import module 导入,但实际依赖的是 pkg 的父包(比如 from google.cloud import storage 对应的是 google-cloud-storage),pipreqs 会正确识别,但你得确认它没被 --ignore 规则意外过滤掉。

















