pip install -e可编辑模式安装的包未出现在importlib.metadata查询列表中
问题原因
- 可编辑安装的机制特性:使用
pip install -e安装包时,不会将包的源码与元数据复制到Python的site-packages目录,仅会在site-packages下生成.pth文件将源码目录加入sys.path,包的.egg-info元数据文件夹直接存放在源码目录内。 - Python 3.8的标准库限制:该版本中
importlib.metadata.distributions()默认仅扫描site-packages目录下的元数据,不会自动遍历sys.path中所有自定义路径的元数据,因此无法识别存放在源码目录的可编辑包元数据。 - 包可正常导入的原因:
.pth文件已经将源码路径加入了Python模块搜索路径,导入模块时的搜索逻辑和元数据扫描逻辑相互独立,因此不影响导入使用。
解决方案
方案1:修改元数据扫描代码(无侵入,推荐)
手动给distributions()方法传入sys.path作为搜索路径,即可覆盖所有自定义路径下的元数据,修改后的代码如下:
from importlib import metadata import sys # 传入sys.path扫描所有模块搜索路径下的元数据 dists = metadata.distributions(path=sys.path) for dist in dists: name = dist.metadata["Name"] version = dist.version # 新增异常兼容,避免部分包未声明License导致报错 license = dist.metadata.get("License", "未声明") print(f'found distribution {name}=={version}')
方案2:修改可编辑安装参数(无需修改扫描代码)
如果你的setuptools版本 >=64.0.0,可以在安装时指定--editable-legacy参数使用旧版可编辑安装逻辑,让元数据可以被默认扫描规则识别,修改Dockerfile中的安装命令为:
RUN pip install -e /src/my-project/python/my-project --editable-legacy
方案3:升级Python版本
Python 3.10及以上版本已经优化了importlib.metadata的默认搜索逻辑,会自动遍历sys.path下的所有路径,无需额外修改即可识别可编辑安装的包。
额外检查项
确认你的setup.py开头已经明确定义了__version__变量,避免安装时元数据生成不完整导致无法识别。
内容的提问来源于stack exchange,提问作者spapadop
相关产品推荐
相关产品推荐

