pip show 输出包的静态元数据(如name、version、location等字段基本可信),但requires和required-by字段不可靠,仅反映安装时记录的声明依赖,无法体现运行时真实依赖关系。

pip show 是查看单个包详细信息最直接的命令,但它显示的依赖关系(Requires 字段)不可靠,仅反映安装时记录的静态元数据,不是运行时真实依赖。
pip show 输出什么?哪些字段可信?
pip show 会读取包的 PKG-INFO 或 pyproject.toml 中预设的元数据,输出包括:Name、Version、Location、Summary、Author、License 等。这些字段基本可信。
但 Requires 字段常为空或不完整——尤其对用 pyproject.toml + setuptools 构建的新包,依赖可能分散在 dependencies、optional-dependencies 或 build-system.requires 中,pip show 不会合并解析这些来源。
- 看到
Requires:后面是空行,不等于该包没依赖 -
Required-by:字段也只基于静态声明,无法识别动态导入或条件导入 - 想确认某包是否真被当前 Python 解释器加载,优先用
import requests; print(requests.__file__)
什么时候该信 pip show 的 Requires?
仅当包明确使用传统 setup.py 并将全部依赖写死在 install_requires 中时,Requires 才可能接近真实。但这类包越来越少。
- 现代包(如
requests、click、typer)普遍用pyproject.toml,pip show无法读取dependencies下的条目 - 带 extras 的依赖(如
requests[socks])完全不会出现在Requires中 - 含 PEP 508 环境标记的依赖(如
typing-extensions>=3.7.4; python_version )也不会被 <code>pip show展示
想看真实依赖树,该用什么?
用 pipdeptree ——它通过实际导入每个包,再读取 importlib.metadata.distribution().requires 和 __requires__,构建出运行时依赖图谱。
- 安装:
pip install pipdeptree - 查局部依赖:
pipdeptree --packages requests(避免全量扫描卡顿) - 反向查谁依赖了某个底层包:
pipdeptree --reverse --packages urllib3 - 揪版本冲突:
pipdeptree --warn会标出不兼容的间接依赖 - 注意:
(non-conforming)表示该包缺失dist-info/direct_url.json或合规 metadata,常见于pip install -e .或 conda 安装的包
真正要排查依赖问题时,pip show 只适合快速确认版本和安装路径;依赖关系本身必须用 pipdeptree 验证——静态元数据和运行时行为之间,差的不只是几行 Requires。











