Jammy python 安装仅对一个用户损坏:无法从“collections”导入名称“Mapping”

Jammy python 安装仅对一个用户损坏:无法从“collections”导入名称“Mapping”

我始终保持 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。

相关内容