如何在Python 3.10+中获取已导入包的发行版名称及版本
问题描述
我有多个发行版,每个都提供同名的Python包(API和功能相同,仅实现方式不同)。我希望能获取当前安装并正在使用的发行版及其版本信息。importlib.metadata看似能满足需求,但测试发现它仅对发行版名称进行大小写和标点不敏感的搜索——当包名和发行版名称一致时没问题,但无法区分共享相同绝对导入路径的两个发行版。查看它的实现后发现有大量抽象,但找不到其他可行的替代方案。
举个常见包的例子:importlib可以获取wheel的版本,因为它的绝对导入路径和发行版名称一致;但要区分当前用的是原始PIL库还是pillow就不行。
示例输出
pip列表:
$ pip list Package Version ---------- ------- pillow 10.3.0 pip 24.0 setuptools 69.5.1 wheel 0.43.0
Python交互测试:
$ python Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from importlib import import_module, metadata >>> import_module('wheel') <module 'wheel' from '/opt/virtualenvs/pillow/lib/python3.10/site-packages/wheel/__init__.py'> >>> import_module('PIL') <module 'PIL' from '/opt/virtualenvs/pillow/lib/python3.10/site-packages/PIL/__init__.py'> >>> metadata.distribution('wheel').version '0.43.0' >>> metadata.distribution('PIL').version Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 969, in distribution return Distribution.from_name(distribution_name) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 548, in from_name raise PackageNotFoundError(name) importlib.metadata.PackageNotFoundError: No package metadata was found for PIL
内容的提问来源于stack exchange,提问作者Sam Newbold
相关产品推荐
相关产品推荐

