软件源错误导致Python无法使用pip
Noyorin Lv1

软件源错误导致 Python 无法使用 pip 的排查与修复指南

1. 问题背景与症状

在 Ubuntu 22.04.3 LTS 系统中,执行 apt install python3-pip 后遭遇以下异常:

  • 主要症状:执行 pip 相关命令时抛出错误:ImportError: cannot import name 'html5lib' from 'pip._vendor' (/usr/lib/python3/dist-packages/pip/_vendor/__init__.py)
  • 次要症状:试图通过安装 python3-venv 来辅助修复时,apt 报错提示未满足的依赖关系(Unmet dependencies):
    1
    2
    3
    python3-venv : Depends: python3.8-venv (>= 3.8.2-1~) but it is not going to be installed
    Depends: python3 (= 3.8.2-0ubuntu2) but 3.10.6-1~22.04 is to be installed
    E: Unable to correct problems, you have held broken packages.

2. 根本原因分析

系统的软件源(Sources List)发生了“版本混淆”

  • Ubuntu 22.04 的默认 Python 版本是 3.10 (3.10.6-1~22.04)。
  • 报错信息显示 apt 在尝试下载 Ubuntu 20.04 时代(代号 focal)的 Python 3.8 对应组件(如 python3.8-venv)。
  • 这种系统级软件源错乱导致 apt 拼凑出了错误的 Python 包依赖链,最终使得全局 pip 安装残缺,引发 html5lib 缺失的 ImportError

3. 完整修复演练步骤

步骤一:清理并纠正错误的软件源

需要找出并将混入的旧版本(focal)源移除或修正:

  1. 检查主软件源
    1
    sudo nano /etc/apt/sources.list
    检查并确保所有行对应的是 Ubuntu 22.04 的代号 jammy。若有 focal,将其修正为 jammy 或加 # 注释掉。
  2. 检查第三方 PPA 源(最常见诱因):
    1
    grep -r "focal" /etc/apt/sources.list.d/
    如果输出中存在包含 focal.list 文件,直接删除对应的文件或编辑将其更正为 jammy

步骤二:强制刷新 Apt 缓存与修复依赖

清理旧缓存,避免 apt 继续读取错误的依赖索引:

1
2
sudo apt clean
sudo apt update

apt 自动纠正被搞乱的依赖关系,并建议执行系统升级将版本拉回正轨:

1
2
sudo apt install -f
sudo apt dist-upgrade

(注:在执行 dist-upgrade 过程中若弹出粉紫色界面提示 “Daemons using outdated libraries”,直接敲击回车键 Enter 允许系统自动重启相关服务即可。)

步骤三:重新安装 Python 核心组件

当软件源正常后,重新安装 venvpip

1
sudo apt install python3-venv python3-pip

如果此时 pip3 依然报错,可使用 Python 官方的引导脚本进行全局强制覆盖修复:

1
2
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py

4. 衍生问题:Pip 安装库时反复下载旧版本(依赖回溯)

在全局环境执行 pip install resend 时,可能会遇到 pip 不断重复下载各种旧版本(如 2.32.1 -> 2.32.0 -> 2.31.0…)的情况。

原因:

  1. 依赖版本回溯机制:新版 pip 解析器发现最新版库与当前系统环境中的其他库冲突时,会自动往前寻找兼容的旧版本。
  2. 网速过慢放大现象:当网络下载速度极慢(如 10~20 kB/s)时,pip 每次后台尝试下载比对都需要耗费大量时间,看起来就像是无限死循环。

解决对策(切换国内镜像源):

永久切换至清华大学镜像源(一劳永逸):

1
2
3
4
5
# 升级 pip 确保配置命令可用
pip install --upgrade pip

# 一键设置全局国内镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

配置完成后,可通过 pip config list 验证。后续的 pip install 速度将大幅提升,依赖解析也会在几秒内快速完成。