pipreqs仅静态扫描显式import语句生成最小化依赖列表,不解析动态导入、setup.py、pyproject.toml及条件导入,需手动补全;基本命令为pipreqs . --encoding=utf8 --force,支持--recursive扫描子目录、--ignore排除指定路径。

pipreqs 能从 Python 源码里提取 import 语句,生成最小化依赖列表,但它不解析运行时动态导入、不处理 setup.py 或 pyproject.toml,也不识别条件导入(比如 if sys.version_info >= (3, 8): import typing)——你得手动补。
pipreqs 生成 requirements.txt 的基本命令
它比 pip freeze 更精准,只列出代码实际 import 的包,而非当前环境所有已装包。执行前确保你在项目根目录:
pipreqs . --encoding=utf8 --force
--encoding=utf8 防止中文路径或注释报错;--force 覆盖已有 requirements.txt。不加 --force 时,如果文件已存在会直接退出。
常见错误现象:UnicodeDecodeError: 'gbk' codec can't decode byte —— 就是没加 --encoding=utf8;FileNotFoundError: No such file or directory: 'requirements.txt' —— 实际是 pipreqs 找不到任何 .py 文件,检查是否在正确目录,或是否存在 __init__.py(它默认跳过不含该文件的子目录)。
如何让 pipreqs 扫描子目录或排除测试/临时文件
默认只扫描含 __init__.py 的包目录,普通脚本目录(如 scripts/)会被忽略。用 --recursive 强制遍历所有子目录:
pipreqs . --recursive --encoding=utf8
排除特定目录或文件,用 --ignore(逗号分隔,支持通配符):
TikHub API 多平台数据爬取工具,支持抖音/TikTok/B站等。用户提及以下需求时调用:1) 爬取视频或评论;2) 获取用户信息/粉丝列表;3) 批量下载无水印视频;4) 抖音链接转文字(下载→音频→Whisper pipeline);5) 调用 TikHubAPI。
--ignore=tests/,migrations/,__pycache__/--ignore=*.pyc,*.md
注意:路径是相对于当前执行目录的,不是相对于每个 .py 文件;--ignore 不影响包内 import 分析逻辑,只控制文件扫描范围。
为什么 pipreqs 有时漏掉依赖?怎么补全?
它只静态分析 import,以下情况必然漏:
- 字符串形式的动态导入:
importlib.import_module("requests") - 条件导入(尤其版本判断后):
if sys.version_info - 第三方框架隐式依赖(如 Flask 扩展常不显式 import 主包)
- setup 中声明但源码未 import 的依赖(如插件式架构)
补全建议:
- 先跑
pipreqs得到基础清单 - 手动追加明显缺失项,例如项目用了
sqlalchemy但只 import 了sqlalchemy.orm—— pipreqs 通常能捕获,但如果用了字符串导入就抓不到 - 用
pip install -r requirements.txt+ 运行单元测试,失败时看报什么ModuleNotFoundError,再加进去
和 pip-tools、poetry 等工具的定位差异
pipreqs 是「源码 → 依赖名」的单向推导,不锁版本、不解决冲突、不生成哈希。它输出的是类似 requests==2.31.0 这样的宽松格式(实际默认无版本号,只写 requests),你需要自己决定是否加版本约束。
如果你需要锁定精确版本、校验哈希、支持多环境(dev/prod),pipreqs 只是第一步 —— 后续得接 pip-compile(pip-tools)或改用 poetry export。别指望它替代 pip freeze 做部署级依赖固化。
容易被忽略的一点:它不会检查 import 是否来自标准库,所以像 import pathlib(Python 3.4+ 内置)也会被当成第三方包写进 requirements.txt —— 这类得人工删掉。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










