importlib.metadata 是 Python 3.8+ 原生支持的轻量标准方式,3.7 需安装 backport;metadata() 需传 PyPI 包名(如 "requests"),返回字典式对象;version() 更常用且容错更好,但开发安装时可能异常。

直接用 importlib.metadata 是最轻量、标准且无需额外依赖的方式,Python 3.8+ 原生支持;3.7 需装 backport importlib-metadata 包。
如何正确调用 metadata() 获取包信息
核心是传入准确的 package_name(即 PyPI 上的名字,不是 import 时的模块名):
- ✅ 正确:
metadata("requests")、metadata("django")、metadata("Pillow") - ❌ 错误:
metadata("requests.api")、metadata("django.core")、metadata("PIL")(后者是旧导入别名,非分发包名) - 调用返回一个
PackageMetadata类似字典的对象,支持.get("Version")、.get("Author")等键访问 - 若包未安装或名字拼错,会抛出
importlib.metadata.PackageNotFoundError
为什么 version() 比 metadata() 更常用
多数场景只关心版本号,version() 更简洁、容错略好(部分包可能缺失完整 METADATA 文件但仍有 VERSION):
from importlib.metadata import version; print(version("numpy"))-
version()底层仍走同一条路径,但自动 fallback 到PKG-INFO或pyproject.toml中的project.version - 注意:某些开发安装(
pip install -e .)的包,version()可能返回0.0.0或报错,此时需检查是否生成了.dist-info目录
在 Python 3.7 中使用需要额外安装 backport
标准库未内置,必须手动加依赖:
立即学习“Python免费学习笔记(深入)”;
- 运行
pip install importlib-metadata - 代码中仍用
from importlib.metadata import metadata, version—— backport 完全兼容标准接口 - 不要混用
pkg_resources.get_distribution(),它已弃用、慢、且在虚拟环境隔离不当时可能返回错误结果 - CI/CD 中若需兼容 3.7,建议在
requirements.txt显式声明importlib-metadata>=4.0; python_version
常见错误:读取不到 Requires-Dist 或依赖列表
metadata().get("Requires-Dist") 返回的是原始字符串列表(含环境标记),不是解析后的依赖名:
- 例如返回
["requests >=2.25.0", "typing-extensions >=3.7.4; python_version - 不能直接当模块名 import,需用
packaging.requirements.Requirement解析才能提取名称和条件 - 若字段为空,不代表无依赖——有些包用
install_requires写在setup.py里,但未写入生成的dist-info/METADATA - 更可靠的方式是结合
pip show <pkg>输出或解析pipdeptree结果
真正麻烦的是跨构建后端(setuptools / flit / poetry)的元数据一致性——不同工具写入 dist-info/METADATA 的字段粒度和格式有差异,importlib.metadata 只保证读取存在字段,不负责标准化。


















