You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:46:00