pipreqs比pip freeze更适合生成项目requirements,因为它仅基于源码import语句识别真实依赖,而非整个环境安装包;但无法识别动态导入、隐式依赖及extras_require等,需人工补充和验证。

pipreqs 为什么比 pip freeze 更适合生成项目 requirements
因为 pip freeze 导出的是当前环境所有已安装包,而 pipreqs 只扫描项目源码里的 import 语句,真正反映项目实际依赖。你在虚拟环境中装了 50 个工具包,但项目只用了 requests 和 numpy?pip freeze 会全列出来,pipreqs 不会。
常见错误现象:pipreqs 生成空文件或漏掉包,通常是没指定正确路径、或代码里用了动态导入(比如 __import__、importlib.import_module)——这类它确实识别不了。
- 使用场景:新项目初始化、交接给同事、CI 构建前固化依赖
- 必须在项目根目录下运行,否则可能找不到 Python 文件或误扫父目录
- 默认不递归扫描子目录,加
--recursive才进src/或tests/ - 遇到中文路径或特殊字符时,部分旧版本
pipreqs会报UnicodeDecodeError,升级到 23.2+ 可缓解
怎么避免 pipreqs 漏掉 pandas、torch 这类“隐式依赖”
不是所有依赖都靠 import 显式写出。比如你用 sklearn,它内部依赖 numpy 和 scipy,但你的代码里没直接 import numpy;又或者你调用了一个封装好的 SDK,它自己 import 了 boto3,但你代码里只有 from my_sdk import upload ——pipreqs 看不到底层。
- 先跑一遍
pipreqs . --force生成初版requirements.txt - 再手动补上已知的间接依赖,尤其是框架类(
django、fastapi)、AI 库(torch、transformers)和它们的常见配套(torchvision、datasets) - 如果项目有
setup.py或pyproject.toml,检查里面的install_requires或dependencies,合并进去 - 运行
pip install -r requirements.txt后执行一次简单测试(比如python -c "import your_module"),能快速暴露缺失项
pipreqs 扫描失败:No such file or directory: 'requirements.txt'
这不是报错,是提示你目标文件已存在且没加 --force。它默认不覆盖,避免误删手动维护的内容。
立即学习“Python免费学习笔记(深入)”;
- 加
--force强制重写:pipreqs . --force - 想输出到别的名字,用
--savepath:pipreqs . --savepath dev-reqs.txt - 想排除测试文件夹,用
--exclude:pipreqs . --exclude=tests/,migrations/ - 如果提示
ModuleNotFoundError: No module named 'xxx',说明某个 import 的模块没装在当前环境——要么装上,要么确认是不是拼写错误或条件导入(这时pipreqs就没法猜)
requirements.txt 里不该出现 == 版本号?什么时候该锁死
pipreqs 默认生成 == 精确版本,这是安全起点,但不是最终答案。是否保留,取决于你的发布节奏和兼容性控制粒度。
- CI/CD 流水线、生产部署包:保留
==,确保每次构建可重现 - 开发环境或库项目:换成
>=+ 最低兼容版(比如requests>=2.28.0),方便本地迭代 - 如果用了
pyproject.toml+poetry或pip-tools,就别用pipreqs生成最终依赖,它只是辅助初筛 - 注意:某些包(如
protobuf、grpcio)小版本升级可能破坏 ABI,光看import扫不出来,得靠实际运行时验证
最常被忽略的一点:pipreqs 不处理 extras_require(比如 requests[security]),也不展开 git+ 或本地路径依赖。这些得人工核对,不能全信输出结果。










