应根据项目场景选择依赖生成工具:快速demo用pip freeze,上线部署优先pipreqs并手动补全间接依赖,有setup.py则直接提取install_requires。

pip freeze 会列出所有已安装包,包括开发依赖和间接依赖
它只看当前 Python 环境的 site-packages,不管你的项目代码里实际 import 了哪些。比如你用 pip install pytest 做测试,但代码里没 import pytest,pip freeze 依然会把它写进 requirements.txt。
常见错误现象:pip freeze > requirements.txt 后部署失败,因为线上环境装了一堆用不到的包,甚至版本冲突(比如 django 和某个测试工具依赖的旧版 sqlparse)。
实操建议:
- 仅在干净虚拟环境中使用(
python -m venv .venv && source .venv/bin/activate),先装项目必需包,再运行pip freeze - 手动删掉明显无关项,如
pip、setuptools、wheel、pytest、black等开发工具 - 若项目有
setup.py或pyproject.toml,优先从那里提取主依赖,而非依赖pip freeze
pipreqs 只扫描项目源码中的 import 语句生成依赖
它不关心你环境里装了什么,只读取 .py 文件里的 import 和 from ... import,然后查 PyPI 推断包名。比如代码里写了 import requests,它就加 requests;写了 from flask import Flask,就加 flask。
常见错误现象:生成的 requirements.txt 缺少子依赖(如 flask 依赖的 werkzeug 不会自动出现),导致运行时报 ModuleNotFoundError;或误判包名(如 import sklearn 被识别为 scikit-learn,但有些旧项目用的是 scipy 直接提供的子模块)。
实操建议:
- 运行前确保代码无语法错误,否则
pipreqs会跳过该文件 - 用
pipreqs --encoding=utf8 --force ./避免中文路径或编码报错 - 加上
--ignore=tests,migrations,venv排除测试、迁移、虚拟环境目录 - 生成后务必手动检查:是否漏了
django-environ这类非 import 方式加载的包?是否把typing(Python 3.7+ 内置)误加进去了?
真实项目中该选哪个?看你的依赖管理方式
如果你用 poetry 或 pip-tools,根本不用纠结——它们有自己的锁文件机制,requirements.txt 只是导出产物,不是源头。
但如果你还在用纯 pip + 手动维护,那就得分场景:
- 快速搭 demo 或 CI 构建临时环境 → 用
pip freeze,快且够用 - 交接给他人或准备上线部署 → 用
pipreqs更干净,再补上运行时必需的间接依赖(可配合pip show flask查Requires字段) - 已有
setup.py且结构规范 → 直接从install_requires提取,比两者都可靠
性能影响不大,但兼容性要注意:pipreqs 不支持 PEP 561 类型包的 stub 导入推断,遇到 import pandas as pd 却没装 pandas-stubs 时可能漏判。
一个更稳妥的混合方案
别只信一个命令。先用 pipreqs 生成初稿,再用 pip install -r requirements.txt --dry-run(pip 23.1+ 支持)验证能否装全;装完后跑一遍 pip check 看依赖冲突;最后对比 pip freeze 输出,把多出来的包逐个确认是否真需要。
最容易被忽略的是动态导入场景:比如用 importlib.import_module(os.getenv("BACKEND")),pipreqs 完全无法识别;还有条件 import(if sys.version_info >= (3, 9): import graphlib),它也当没看见。这种时候,光靠工具不行,得靠人盯日志和报错反推。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











