Python3.8虚拟环境中ImportError:无法导入Mapping,为何调用Python3.10模块?
解决Python 3.8虚拟环境下ImportError: cannot import name 'Mapping' from 'collections'的问题
问题描述
- 使用Poetry 1.0.9搭配Python3.8虚拟环境,系统同时安装了Python3.10和3.8
- 执行
from collections import Mapping时触发ImportError,尝试替换为from collections.abc import Mapping后问题仍未解决 - 执行
make upload时触发错误,报错显示解释器试图从/usr/lib/python3.10/collections/__init__.py导入模块,完整错误日志如下:
(as-common-iqrqnKMP-py3.8) lev@lev-HP-ProBook-445-G7:~/work_atol/as_common$ make upload poetry build Building as-common (2.5.256.3371b1) - Building sdist - Built as-common-2.5.256.3371b1.tar.gz - Building wheel - Built as_common-2.5.256.3371b1-py3-none-any.whl poetry config repositories.atol-pypi "repo_url" poetry publish -r atol-pypi -u "user" -p "pass" [ImportError] cannot import name 'Mapping' from 'collections' (/usr/lib/python3.10/collections/__init__.py) make: *** [Makefile:23: upload] Ошибка 1
解决思路
确认Poetry绑定的Python版本
执行poetry run python --version验证当前Poetry使用的Python版本是否为3.8。若不是,手动指定虚拟环境的Python路径:poetry env use /usr/bin/python3.8重新激活虚拟环境后再次执行
make upload。检查Makefile命令上下文
查看Makefile中upload目标的命令,确保poetry publish等操作在虚拟环境中执行。可以在命令前添加poetry run,或者确认执行make前已正确激活虚拟环境(即使终端显示虚拟环境名称,也可能存在Poetry调用系统Python的情况)。清理缓存并重新构建
清理Poetry缓存和旧构建产物,避免缓存干扰:poetry cache clear --all pypi rm -rf dist/ poetry build --clean完成后重新尝试发布操作。
排查第三方依赖包
若自身代码已替换为from collections.abc import Mapping,则可能是某个依赖包仍使用旧导入方式。可以:- 执行
poetry show列出所有依赖,排查存在兼容问题的包 - 更新依赖到同时兼容Python3.8和3.10的版本
- 在
pyproject.toml中明确限制Python版本:[tool.poetry.dependencies] python = "^3.8"
- 执行
调整系统环境变量优先级
确保Python3.8的路径在PATH中优先级高于Python3.10,临时设置:export PATH=/usr/bin/python3.8:$PATH之后再执行
make upload。
内容的提问来源于stack exchange,提问作者Lev Kakalashvili
相关产品推荐
相关产品推荐

