Python怎么管理项目依赖_Pipreqs自动生成项目专属requirements

4次阅读

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

Python 怎么管理项目依赖_Pipreqs 自动生成项目专属 requirements

pipreqs 为什么比 pip freeze 更适合生成项目 requirements

因为 pip freeze 导出的是当前环境所有已安装包,而 pipreqs 只扫描项目源码里的 import 语句,真正反映项目实际依赖。你在虚拟环境中装了 50 个工具包,但项目只用了 requestsnumpypip freeze 会全列出来,pipreqs 不会。

常见错误现象:pipreqs 生成空文件或漏掉包,通常是没指定正确路径、或代码里用了动态导入(比如 __import__importlib.import_module)——这类它确实识别不了。

  • 使用场景:新项目初始化、交接给同事、CI 构建前固化依赖
  • 必须在项目根目录下运行,否则可能找不到 Python 文件或误扫父目录
  • 默认不递归扫描子目录,加 --recursive 才进 src/tests/
  • 遇到中文路径或特殊字符时,部分旧版本 pipreqs 会报 UnicodeDecodeError,升级到 23.2+ 可缓解

怎么避免 pipreqs 漏掉 pandas、torch 这类“隐式依赖”

不是所有依赖都靠 import 显式写出。比如你用 sklearn,它内部依赖 numpyscipy,但你的代码里没直接 import numpy;又或者你调用了一个封装好的 SDK,它自己 import 了 boto3,但你代码里只有 from my_sdk import upload ——pipreqs 看不到底层。

  • 先跑一遍 pipreqs . --force 生成初版 requirements.txt
  • 再手动补上已知的间接依赖,尤其是框架类(djangofastapi)、AI 库(torchtransformers)和它们的常见配套(torchvisiondatasets
  • 如果项目有 setup.pypyproject.toml,检查里面的 install_requiresdependencies,合并进去
  • 运行 pip install -r requirements.txt 后执行一次简单测试(比如 python -c "import your_module"),能快速暴露缺失项

pipreqs 扫描失败:No such file or directory: ‘requirements.txt’

这不是报错,是提示你目标文件已存在且没加 --force。它默认不覆盖,避免误删手动维护的内容。

立即学习 Python 免费学习笔记(深入)”;

  • --force 强制重写:pipreqs . --force
  • 想输出到别的名字,用 --savepathpipreqs . --savepath dev-reqs.txt
  • 想排除测试文件夹,用 --excludepipreqs . --exclude=tests/,migrations/
  • 如果提示 ModuleNotFoundError: No module named 'xxx',说明某个 import 的模块没装在当前环境——要么装上,要么确认是不是拼写错误或条件导入(这时 pipreqs 就没法猜)

requirements.txt 里不该出现 == 版本号?什么时候该锁死

pipreqs 默认生成 == 精确版本,这是安全起点,但不是最终答案。是否保留,取决于你的发布节奏和兼容性控制粒度。

  • CI/CD 流水线、生产部署包:保留 ==,确保每次构建可重现
  • 开发环境或库项目:换成 >= + 最低兼容版(比如 requests>=2.28.0),方便本地迭代
  • 如果用了 pyproject.toml + poetrypip-tools,就别用 pipreqs 生成最终依赖,它只是辅助初筛
  • 注意:某些包(如 protobufgrpcio)小版本升级可能破坏 ABI,光看 import 扫不出来,得靠实际运行时验证

最常被忽略的一点:pipreqs 不处理 extras_require(比如 requests[security]),也不展开 git+ 或本地路径依赖。这些得人工核对,不能全信输出结果。

text=ZqhQzanResources