能否使用importlib.metadata获取当前所属安装包的自身版本号?
需求完全可实现,核心是自动获取当前代码所属包的标识,不需要提前定义
__version__变量 方案1:用__package__内置变量获取包名(最简单通用)
Python的每个模块都内置了__package__变量,会直接返回当前模块所属包的名称。如果你的代码写在包的顶层模块里,直接用即可:
from importlib.metadata import version self_version = version(__package__)
如果代码写在子模块中(比如你的包叫myapp,代码放在myapp.utils模块里),只需要拆分取顶层包名即可适配:
from importlib.metadata import version top_package = __package__.split(".")[0] self_version = version(top_package)
方案2:通过模块路径反向查找发行包(适配分发名与导入名不一致的场景)
如果你的项目存在PyPI分发名称和导入包名不一致的情况(比如分发名是pyyaml,导入名是yaml),可以通过当前模块的文件路径反向匹配对应的发行包,完全不需要依赖包名匹配:
from importlib.metadata import distribution from pathlib import Path # 取当前模块的绝对路径,查询对应的发行包元数据 current_file = Path(__file__).resolve() dist = distribution(path=str(current_file)) self_version = dist.version
注意事项
- 两种方案都仅在包已经被正确安装到当前运行环境(包括pip的可编辑安装模式)时生效,直接运行本地未安装的脚本会报错,完全符合你提到的wheel包安装后使用的场景。
- 如果需要兼容Python 3.8以前的版本,可以安装第三方兼容包
importlib-metadata,将导入语句替换为from importlib_metadata import version, distribution即可。
内容的提问来源于stack exchange,提问作者Thurse
相关产品推荐
相关产品推荐

