pip show 的 Requires 字段不可靠,仅显示静态元数据,常为空或不完整;pipdeptree 通过运行时导入分析依赖,支持 extras、环境标记等,更准确。

pip show 查看单个包的元信息是否可靠
pip show 输出的是包安装时记录的 PKG-INFO 或 pyproject.toml 中的静态元数据,不是实时解析代码得出的依赖关系。它显示的 Requires 字段常为空或不完整——尤其对现代使用 pyproject.toml + setuptools 构建的包,依赖可能分散在 dependencies、optional-dependencies 甚至 build-system.requires 中。pip show 不会合并这些来源。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
pip show requests快速查作者、版本、安装路径、概要描述没问题,但别信它的Requires - 若看到
Requires:后面是空行,不代表没依赖,只是没写进传统install_requires - 想确认某包是否真被当前环境加载,优先用
import requests; print(requests.__file__)验证路径和来源
pipdeptree 为什么比 pip show 更适合看依赖树
pipdeptree 是运行时分析工具:它导入每个已安装包,读取其 __requires__、metadata(如 importlib.metadata 获取的 requires_dist),再递归构建图谱。它能识别 extras_require(比如 requests[socks])、PEP 508 环境标记(如 typing-extensions>=3.7.4; python_version ),还能标出冲突项(用 <code>--warn 参数)。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 安装后先跑
pipdeptree --packages requests看局部树,避免全量扫描卡顿 - 加
--reverse可查“谁依赖了urllib3”,排查冗余或安全风险包 - 遇到
ImportError: cannot import name 'ABC' from 'collections'这类错误,用pipdeptree --warn常能揪出版本不兼容的间接依赖
为什么 pipdeptree 有时显示 “(non-conforming)” 或跳过某些包
这是因为 pipdeptree 依赖包的 dist-info 目录中存在合规的 direct_url.json 或 metadata.json。从源码 pip install -e . 安装、或用 conda 装的包,可能缺失这些文件,导致 pipdeptree 无法获取其依赖声明,就标为 (non-conforming) 或直接忽略。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 检查包是否本地开发安装:
pip show mypackage中若Location:指向你自己的项目目录,大概率会被pipdeptree降级处理 - 想强制包含,可用
--include-editables参数,但它仍无法推导出 editable 包的依赖,只当叶子节点展示 - Conda 环境下慎用
pipdeptree;优先用conda list --explicit或mamba repoquery depends -a requests
替代方案:用 importlib.metadata 替代 pip show 的编程式查询
如果脚本里需要动态读包信息(比如 CI 中校验依赖版本),硬调 pip show 命令既慢又难解析。Python 3.8+ 的 importlib.metadata 更轻量、更可控。
示例:
from importlib import metadata
dist = metadata.distribution("requests")
print(dist.version)
print(list(dist.requires or [])) # 注意:这仍是静态 requires_dist,非运行时实际导入链
注意点:
-
dist.requires返回的是 PEP 508 字符串列表(如['charset-normalizer>=2.0.0,=2.5,),需用 <code>packaging.requirements.Requirement解析才能做版本判断 - 它不解决循环依赖或条件依赖的展开问题——那仍是
pipdeptree的职责 - 若目标包未通过
pip安装(比如sys.path注入的本地模块),metadata.distribution()会抛PackageNotFoundError
实际依赖分析永远在“静态声明”和“运行时行为”之间有 gap。工具选哪个,取决于你要回答的问题:是“这个包说自己要什么”,还是“现在环境里它真正拉进来的是什么”。

















