importlib.metadata 是 python 3.8+ 内置模块,用于读取已安装包的元数据,如 version() 获取版本号、metadata() 获取作者等信息,需使用分发包名而非导入名;遇 packagenotfounderror 应检查安装、环境、大小写及 editable 安装问题;还支持获取依赖列表和入口点;旧版 python 需安装 importlib_metadata backport。

importlib.metadata 读取包元数据的基本用法
Python 3.8+ 自带 importlib.metadata,不用额外安装,直接导入就能查已安装包的名称、版本、作者等信息。它替代了旧的 pkg_resources,更轻量、启动更快。
最常用的是 importlib.metadata.version() 和 importlib.metadata.metadata():
-
version("requests")返回字符串"2.31.0"(若已安装) -
metadata("numpy")返回一个importlib.metadata.PackageMetadata对象,支持类似字典的键访问,比如meta["Author"]、meta["Summary"] - 注意:包名必须是 分发包名(distribution name),不是导入模块名。例如
import pandas对应的分发包名是"pandas",但import Pillow对应的是"Pillow",不是"PIL"
遇到 PackageNotFoundError 怎么办
调用 version() 或 metadata() 时抛出 importlib.metadata.PackageNotFoundError,说明传入的包名在当前环境未被识别为已安装分发包——这比“模块不存在”更隐蔽。
常见原因和检查步骤:
- 确认是否真的安装了:运行
pip show <name></name>,比如pip show flask;如果没输出,说明没装或装在别的环境 - 检查虚拟环境:你在 venv 或 conda 环境里运行 Python,但 pip 安装到了系统 Python?用
which python和which pip对齐路径 - 包名大小写敏感:
importlib.metadata.version("pyYAML")会失败,正确是"PyYAML"(pip show PyYAML可验证) - editable 安装(
pip install -e .)可能不生成标准.dist-info目录,此时importlib.metadata无法发现;可改用importlib.metadata.files("myproject")查是否有文件记录,或退回到读取setup.py/pyproject.toml
获取依赖列表和入口点(entry points)
除了基础元数据,importlib.metadata 还能读取 Requires-Dist(依赖)和 entry_points(如命令行工具注册),这对构建工具或插件系统很实用。
示例:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
from importlib import metadata
<h1>获取依赖(返回字符串列表,含版本约束)</h1><p>requires = metadata.requires("click")
if requires:
print(requires[:3]) # 如 ['importlib-metadata >=3.6.0; python_version </p><h1>获取所有 entry_points(返回 EntryPoints 对象)</h1><p>eps = metadata.entry_points()</p><h1>按组过滤,比如找 console_scripts</h1><p>console_scripts = eps.select(group="console_scripts")
for ep in console_scripts:
print(f"{ep.name} → {ep.value}") # 如 "flask → flask.cli:main"</p>
注意:requires() 返回的是 PEP 508 格式字符串,不是已解析的包名列表;若需进一步处理依赖关系,得配合 packaging.requirements.Requirement 解析。
兼容旧版 Python(3.7 及以下)怎么办
importlib.metadata 是 3.8+ 原生模块,3.7 及更早版本需要回退到第三方 backport:importlib_metadata 包。
安装与使用方式几乎一致:
- 执行
pip install importlib_metadata - 代码中仍写
from importlib import metadata—— backport 会自动 patch 到标准路径 - 但要注意:backport 的
files()在某些打包场景(如 zipapp)下可能返回None,而原生 3.11+ 已修复 - 如果你的项目要支持 3.7,建议在
pyproject.toml的dependencies中加上importlib_metadata; python_version
真正容易被忽略的是:同一份代码在不同 Python 版本下,metadata.distribution("xxx") 返回对象的 .read_text("RECORD") 行为可能不一致——3.12 开始限制只读文本文件,二进制文件(如 WHEEL)需用 .read_bytes()。别硬编码假设所有字段都能用 read_text()。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










