我始终保持 Jammy Ubuntu 为最新版本,几乎每天都安装所有更新。因此,我安装的所有内容都是最新版本。
我安装了两个重要的应用程序:libvirt + qemu 上的 Windows VM 和 docker(包括 docker compose)。
有一天,我注意到虚拟机管理器无法再从 gnome 启动(我将其固定到我的应用程序栏)。它只是自动关闭,它抛出的错误是: ImportError:无法从‘collections’(/usr/lib/python3.10/collections/)导入名称‘Mapping’在里面.py)
但是,应用程序从命令行启动。
但是然后,我必须运行一个 docker compose 命令(该命令前一天已经成功完成),结果如下:
docker-compose up -d
Traceback (most recent call last):
File "/usr/bin/docker-compose", line 33, in <module>
sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')())
File "/usr/bin/docker-compose", line 25, in importlib_load_entry_point
return next(matches).load()
File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 171, in load
module = import_module(match.group('module'))
File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 13, in <module>
import docker.errors
File "/home/myUserName/.local/lib/python3.10/site-packages/docker/__init__.py", line 1, in <module>
from .api import APIClient
File "/home/myUserName/.local/lib/python3.10/site-packages/docker/api/__init__.py", line 1, in <module>
from .client import APIClient
File "/home/myUserName/.local/lib/python3.10/site-packages/docker/api/client.py", line 6, in <module>
import requests
File "/home/myUserName/.local/lib/python3.10/site-packages/requests/__init__.py", line 43, in <module>
import urllib3
File "/home/myUserName/.local/lib/python3.10/site-packages/urllib3/__init__.py", line 8, in <module>
from .connectionpool import (
File "/home/myUserName/.local/lib/python3.10/site-packages/urllib3/connectionpool.py", line 29, in <module>
from .connection import (
File "/home/myUserName/.local/lib/python3.10/site-packages/urllib3/connection.py", line 39, in <module>
from .util.ssl_ import (
File "/home/myUserName/.local/lib/python3.10/site-packages/urllib3/util/__init__.py", line 3, in <module>
from .connection import is_connection_dropped
File "/home/myUserName/.local/lib/python3.10/site-packages/urllib3/util/connection.py", line 3, in <module>
from .wait import wait_for_read
File "/home/myUserName/.local/lib/python3.10/site-packages/urllib3/util/wait.py", line 1, in <module>
from .selectors import (
File "/home/myUserName/.local/lib/python3.10/site-packages/urllib3/util/selectors.py", line 14, in <module>
from collections import namedtuple, Mapping
ImportError: cannot import name 'Mapping' from 'collections' (/usr/lib/python3.10/collections/__init__.py)
我尝试重新安装 python,并使用 chatGPT 尝试解决该问题,但没有任何效果。
我尝试过以 root 身份运行相同的命令。令人惊讶的是,以 root 身份运行相同的命令没有任何问题!
因此,一定与我的用户设置有关的某些内容不允许 Python 运行。
但是,我的 ~ 中没有 python 文件夹,其中没有任何.config
与 python 相关的内容,只有一个.local/lib/python3.10/site-packages/
,我删除了其中的所有 .pyc 文件,以及一个.local/bin/
有几个 python 文件(我没有删除那些)的。
因此,我尝试了所有能想到的方法,重新安装了 python、pip,现在,如果您有任何想法,请帮助我
我的python版本是3.10.12
答案1
您需要删除冲突的 Python 依赖项版本,如评论中所建议的那样:
rm -rf /home/myUserName/.local/lib/python3.10/
它与系统安装中已存在的软件包冲突:
docker/__init__.py
应该由 提供python3-docker
。在本地安装该 Python 包的另一个版本就像拥有两个相互冲突的 Docker 版本,冒着出现更多错误的风险requests/__init__.py
应由python3-requests
urllib3/__init__.py
应由python3-urllib3
- Python 3.10 在之前的版本中删除了“从‘collections’中移除‘Mapping’
as planned by the
:1:DeprecationWarning:从‘collections’而不是从‘collections.abc’中使用或导入 ABC 已从 Python 3.3 开始弃用,并且在 3.10 中它将停止工作”。这就是为什么使用与 Ubuntu 捆绑的 urllib3 版本而不是安装本地版本很重要的原因 - 删除
~/.local/lib/python3.10/
总是安全的。它仅包含以不推荐的方式安装的本地安装的 Python 依赖项。如果有重要的依赖项,您可以使用 lockfiles 和 venv 或其他东西
我还建议您从 Docker Compose V1 升级docker-compose
到 Docker Compose V2,docker compose
因为 V1 不再受支持:https://docs.docker.com/compose/migrate/。使用Docker Compose V2以后也会避免这个问题,因为它不使用Python。