最可靠的方式是直接查看 pip show 的 Requires 字段,它只读取本地已安装包的元数据,显示作者声明的直接依赖,不递归展开子依赖,且不依赖网络或额外工具。

直接看 pip show 的 Requires 字段,这是最轻量、最可靠的方式。它不依赖额外工具,也不需要网络请求,只读取本地已安装包的元数据。
pip show 显示直接依赖(Requires 字段)pip show 输出里明确列出该包声明的直接依赖,字段名就是 Requires(有时也叫 Requires-Dist)。这个值来自包的 setup.py 或 pyproject.toml,是作者写死的约束。
- 仅显示一级依赖,不递归展开子依赖
- 如果某依赖未安装,
Requires 字段仍会照常显示,但不代表它已就绪
- 字段为空或显示
Requires: (后面没内容),说明该包没有声明任何依赖
- 注意区分
Required-by:那是“谁依赖我”,不是“我依赖谁”
Requires 字段仍会照常显示,但不代表它已就绪 Requires: (后面没内容),说明该包没有声明任何依赖 Required-by:那是“谁依赖我”,不是“我依赖谁”例如运行 pip show requests,输出中你会看到:
Name: requests Version: 2.32.5 ... Requires: charset-normalizer, idna, urllib3, certifi
pipdeptree 查看完整依赖树(含嵌套依赖)pipdeptree 是解决“这个包到底拉了哪些东西进来”的实际需求的首选。它把 Requires 逐层展开,连带版本冲突、重复安装、循环引用都标得清清楚楚。
- 必须先
pip install pipdeptree 才能用
- 默认显示所有已安装包的全图,太杂;加
-p <package> 只查目标包,如 pipdeptree -p flask
- 它会检查每个依赖是否真的已安装,并对比
required 和 installed 版本,比如:urllib3 [required: >=1.21.1, installed: 2.2.0]
- 如果某依赖被多个包以不同约束要求(如 A 要
numpy>=1.20,B 要 numpy<1.25),pipdeptree --warn 会标出潜在冲突
pip check 验证依赖是否满足(运行时可用性)pip check 不展示依赖列表,而是做“健康检查”:它扫描所有已安装包的 Requires,确认每一条依赖是否真有对应包+满足版本约束。
- 没输出 = 当前环境所有依赖都满足
- 一旦报错,错误信息类似:
requests 2.32.5 requires urllib3<3, but you have urllib3 3.0.0.
- 它不关心你是否“用得上”某个依赖,只管“有没有、对不对”
- 这个命令在 CI 流程或部署前跑一次很实用,比人工翻
pip show 更防疏漏
容易忽略的关键点pip show 和 pipdeptree 都只反映“当前环境中已安装的包”,不会告诉你 PyPI 上最新版的依赖是什么。如果你刚 pip install 一个包,但它的某个依赖被你手动降级过,pip show 照样显示原始声明,而 pipdeptree 和 pip check 才会暴露不一致。真正决定运行行为的,永远是实际装进去的版本,不是 setup.py 里写的那一行。
pip install pipdeptree 才能用 -p <package> 只查目标包,如 pipdeptree -p flask required 和 installed 版本,比如:urllib3 [required: >=1.21.1, installed: 2.2.0] numpy>=1.20,B 要 numpy<1.25),pipdeptree --warn 会标出潜在冲突 pip check 不展示依赖列表,而是做“健康检查”:它扫描所有已安装包的 Requires,确认每一条依赖是否真有对应包+满足版本约束。
- 没输出 = 当前环境所有依赖都满足
- 一旦报错,错误信息类似:
requests 2.32.5 requires urllib3<3, but you have urllib3 3.0.0. - 它不关心你是否“用得上”某个依赖,只管“有没有、对不对”
- 这个命令在 CI 流程或部署前跑一次很实用,比人工翻
pip show更防疏漏


















