Python如何查询importlib-metadata和importlib-resources版本
问题描述
在RHEL Docker容器中部署Python 3.8基础环境,当前运行的Python版本为 Python 3.8.6。尝试常规方式查询importlib-metadata和importlib-resources版本时全部失效,操作记录如下:
[root@6d205ce6c52d /]# python3.8 --version Python 3.8.6 [root@6d205ce6c52d /]# pip3.8 list | grep import zope.deferredimport 4.4 [root@6d205ce6c52d /]# pip3.8 show importlib-metdata WARNING: Package(s) not found: importlib-metdata [root@6d205ce6c52d /]# pip3.8 show importlib-resources WARNING: Package(s) not found: importlib-resources [root@6d205ce6c52d /]# python3.8 Python 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import importlib.metadata >>> dir(importlib.metadata) ['ConfigParser', 'Distribution', 'DistributionFinder', 'EntryPoint', 'FastPath', 'FileHash', 'MetaPathFinder', 'MetadataPathFinder', 'PackageNotFoundError', 'PackagePath', 'PathDistribution', 'Prepared', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'abc', 'collections', 'csv', 'distribution', 'distributions', 'email', 'entry_points', 'files', 'functools', 'import_module', 'io', 'itertools', 'metadata', 'operator', 'os', 'pathlib', 'posixpath', 're', 'requires', 'starmap', 'suppress', 'sys', 'version', 'zipfile'] >>> print(importlib.metadata.version) <function version at 0x7f7b423400d0>
实测importlib.metadata、importlib.resources模块均不存在__version__属性,常规版本查询方法全部失效,需要找到正确的版本获取方式。
原因
查询失败的核心原因如下:
- Python 3.8 版本开始,
importlib.metadata和importlib.resources已经作为标准库内置模块随CPython官方发行包一起交付,不再是独立的第三方PyPI包,因此pip无法检索到独立安装记录属于正常现象。 - 作为标准库组成部分,这两个模块没有独立于Python解释器的单独版本号,版本完全和当前运行的Python版本绑定,当前环境Python版本为3.8.6,对应的这两个模块就是Python 3.8.6内置的标准实现版本。
- 交互环境中打印
importlib.metadata.version得到的是模块内置的、用于查询其他软件包版本的version()工具函数,不是模块自身的版本属性,属于概念混淆。 - 执行
pip3.8 show importlib-metdata时存在拼写错误,正确包名是importlib-metadata,命令中漏写了一个a,就算提前安装了第三方包,拼写错误也会返回找不到包的提示。
验证方法
要确认当前加载的是内置标准库版本,可以直接打印模块的文件加载路径:
>>> import importlib.metadata, importlib.resources >>> print(importlib.metadata.__file__) # 输出路径位于Python3.8标准库目录,示例:/usr/lib64/python3.8/importlib/metadata.py >>> print(importlib.resources.__file__) # 输出路径位于Python3.8标准库目录,示例:/usr/lib64/python3.8/importlib/resources.py
只要输出路径在Python安装目录的标准库路径下,即可确认是内置版本,版本和当前Python解释器版本完全一致。
补充说明
如果业务需要使用高于Python3.8内置版本的新特性,可以手动通过pip安装对应的第三方backport包:
pip3.8 install importlib-metadata importlib-resources
安装完成后,pip就可以正常查询到这两个包的独立版本,Python导入时也会优先加载手动安装的第三方版本,覆盖内置的标准库实现。
内容的提问来源于stack exchange,提问作者RAHUL RAJ D N
相关产品推荐
相关产品推荐

