pip show与importlib.metadata.version获取版本不一致的原因排查
问题原因分析
核心差异出在importlib.metadata的查找逻辑和本地模块的安装状态上:
importlib.metadata.version("mymodule")会遍历Python的site-packages目录,查找所有已安装的mymodule元数据文件(比如.dist-info或.egg-info文件夹),返回它找到的第一个匹配的版本——通常是之前安装过的旧版本(可能是目录排序优先或安装时间晚的旧版本),而非当前开发的本地版本。pip show mymodule是直接查询pip的包管理数据库,返回的是pip最后一次成功安装的版本,也就是你本地安装的正确版本。
具体原因拆解:
- 你之前通过
pip install安装过旧版本的mymodule,这些旧版本的元数据文件夹还残留在site-packages中。importlib.metadata只会读取已安装包的元数据,不会主动识别你开发目录里的pyproject.toml。 - 如果你直接运行开发目录下的代码但未使用可编辑安装(
pip install -e .),Python会优先导入开发目录的模块,但importlib.metadata依然会去site-packages找元数据,自然拿到旧版本。
解决建议:
- 先彻底卸载所有旧版本:
pip uninstall -y mymodule,再执行pip install -e .进行可编辑安装,这样importlib.metadata就能正确读取开发版本的元数据。 - 也可以直接在
__init__.py中硬编码版本号,同时用setuptools-scm这类工具自动同步pyproject.toml和__init__.py的版本,避免手动维护出错。
内容的提问来源于stack exchange,提问作者Wouter Schols
相关产品推荐
相关产品推荐

