pip show 不显示真实依赖树,因其仅读取静态元数据中的 requires-dist 字段,该字段常为空或不准确;应使用 pipdeptree 查看动态解析后的实际依赖关系。

pip show 本身不显示包的依赖树,只列出直接声明的 Requires 字段,且该字段常为空或不准确——别指望靠它查清真实依赖关系。
pip show 输出的 Requires 为什么经常是空的或不可靠?
Python 包的元数据中 Requires-Dist 字段在安装时可能未被完整写入 dist-info/METADATA,尤其用 pip install --no-deps 或从本地 wheel 安装时。很多包(如 requests)在 setup.py 里动态生成依赖,pip show 读不到运行时逻辑。
- 执行
pip show requests可能只显示Requires:空行,但实际依赖urllib3、certifi等 -
pip show读取的是已安装包的静态元数据,不是当前环境解析后的依赖图 - 条件依赖(如
typing-extensions; python_version )不会被展开,也不会按当前 Python 版本过滤
想看真实依赖,应该用 pipdeptree 而不是 pip show
pipdeptree 基于当前环境实际安装的包反向构建依赖图,能识别版本冲突、重复安装、条件依赖是否生效。
通过 Pipedream Connect 将 OpenClaw 代理连接到数千个应用,实现每个代理的 OAuth 隔离,提供一流 MCP 工具以及实时已连接账户发现
- 安装:
pip install pipdeptree - 查看某包及其所有下游依赖:
pipdeptree --packages requests - 只看上游依赖(谁依赖了它):
pipdeptree --reverse --packages flask - 忽略已满足的依赖(聚焦冲突):
pipdeptree --warn failure
如果必须用原生命令,pip show + pip freeze 组合能补救什么?
单独 pip show 不够,但配合 pip freeze 至少能确认“这个包声称需要的包,当前环境里有没有”。
- 先查
pip show pandas,记下Requires:后的包名(如numpy, pytz, python-dateutil) - 再执行
pip freeze | grep -i "numpy\|pytz\|python-dateutil",确认它们是否已安装及版本 - 注意大小写和命名差异:
pip show写的是PyYAML,但pip freeze输出可能是pyyaml
真正复杂的依赖问题(比如 ImportError: cannot import name 'ABC' from 'collections'),光看 pip show 没用——它不告诉你哪个包偷偷降级了 typing-extensions,也不反映 extras_require 是否被触发。这时候得上 pipdeptree -r -p package_name,或者直接 python -c "import package_name; print(package_name.__file__)" 看加载路径,再结合 pip check 验证一致性。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










