如何在Python3.10+中获取导入包的发行版名称

问题描述 投票:0回答:1

我有多个发行版,每个发行版都提供同名的 Python 包(因为它们具有相同的 API 和相同的功能,只是实现不同)。我希望能够报告当前安装和正在使用的版本及其版本。

importlib.metadata
似乎具有我想要的功能,但从我的测试来看,它似乎只是对发行版名称进行了大小写和标点符号不敏感的搜索,这在大多数情况下都有效,它们是相同的,但永远不会能够区分共享相同绝对导入路径的两个发行版。我还浏览了显示大量抽象的实现,但没有看到任何其他当前实现的选项。叹。这足以让人想重新开始编写 shell 脚本。

这是一个使用常见包而不是我自己的包的具体示例。 importlib 可以报告wheel的版本,因为它的绝对导入路径与发行版名称相同,但是如果我们想知道我们使用的是原始PIL库还是pillow,它就不再起作用了。 `$ 点列表 套装版本


枕头10.3.0 点 24.0 安装工具 69.5.1 轮子0.43.0 $ 蟒蛇 Linux 上的 Python 3.10.12(主要,2023 年 11 月 20 日,15:14:05)[GCC 11.4.0] 输入“帮助”、“版权”、“制作人员”或“许可证”以获取更多信息。

从 importlib 导入 import_module,元数据 import_module('轮子') init.py'> 导入模块('PIL') init.py'> 元数据.distribution('wheel').version ‘0.43.0’ 元数据.distribution('PIL').version 回溯(最近一次调用最后一次): 文件“”,第 1 行,位于 文件“/usr/lib/python3.10/importlib/metadata/init.py”,第 969 行,分发中 返回 Distribution.from_name(distribution_name) 文件“/usr/lib/python3.10/importlib/metadata/init.py”,第 548 行,from_name 引发 PackageNotFoundError(名称) importlib.metadata.PackageNotFoundError:未找到 PIL 的包元数据 `

python-3.x metadata python-packaging python-importlib
1个回答
0
投票

请参阅 将导入映射到分发包。导入名称通常与包名称相同,但并非总是如此:

>>> import importlib.metadata
>>> importlib.metadata.packages_distributions()["PIL"]
['pillow']
© www.soinside.com 2019 - 2024. All rights reserved.