一、解决系统yum源的问题

CentOS 7 已于 2024 年 6 月 30 日正式停止维护(EOL)。

CentOS 官方随后关闭了 mirrorlist.centos.org 镜像列表服务器。目前系统中的默认 .repo 配置文件(包含基础源、SCL 扩展源等)因无法连接到官方镜像列表而直接抛出 502 Bad Gateway 错误。

🛠️ 解决方案
要解决此问题,需要将系统的 YUM 源全部替换为归档源(CentOS Vault Mirror)。请在终端中按顺序执行以下命令:

  1. 备份现有的 repo 配置文件
    Bash
    sudo mkdir -p /etc/yum.repos.d/backup
    sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
  2. 重新下载并配置 Vault 镜像源
    方案 A:国内服务器(推荐,速度更快)
    直接使用阿里云的 CentOS 7 归档镜像源(同时修复基础源与截图报错的 SCLo 源):

Bash

1. 下载基础源 CentOS-Base.repo

sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

2. 将基础源中的路径调整为 vault 归档路径

sudo sed -i -e 's/mirrors.cloud.aliyuncs.com/mirrors.aliyun.com/g' /etc/yum.repos.d/CentOS-Base.repo
sudo sed -i -e 's/mirrors.aliyun.com/centos/mirrors.aliyun.com/centos-vault/g' /etc/yum.repos.d/CentOS-Base.repo

3. 下载并修复 SCLo 源(彻底消除 centos-sclo-rh 报错)

sudo curl -o /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo https://mirrors.aliyun.com/repo/Centos-7-SCLo-rh.repo
sudo curl -o /etc/yum.repos.d/CentOS-SCLo-scl.repo https://mirrors.aliyun.com/repo/Centos-7-SCLo-scl.repo
sudo sed -i 's/mirrors.aliyun.com/centos/mirrors.aliyun.com/centos-vault/g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
sudo sed -i 's/mirrors.aliyun.com/centos/mirrors.aliyun.com/centos-vault/g' /etc/yum.

这里会报错,按下面修改

报错信息 File contains no section headers 并且文件第一行为 '<!DOCTYPE html>\n',说明上一步在使用 curl 下载 .repo 配置文件时,请求的 URL 链接返回了一个 404 网页或错误页面。

curl 将返回的 HTML 网页源码保存成了 .repo 文件,而 yum 无法在 HTML 代码中识别出形如 [repo-id] 的配置节点标题,因此抛出了格式异常。

解决方法
直接删除该损坏的文件,并手动将正确的 SCL 归档源配置写入文件中:

  1. 删除损坏的 .repo 文件
    Bash
    sudo rm -f /etc/yum.repos.d/CentOS-SCLo-scl*.repo
  2. 直接生成正确的 SCL 镜像源配置文件
    复制以下命令在终端中运行,直接写入包含正确的 Vault 归档路径配置:

Bash

写入 CentOS-SCLo-scl-rh.repo

sudo cat << 'EOF' > /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/sclo/x86_64/rh/
gpgcheck=0
enabled=1
EOF

写入 CentOS-SCLo-scl.repo

sudo cat << 'EOF' > /etc/yum.repos.d/CentOS-SCLo-scl.repo
[centos-sclo-sclo]
name=CentOS-7 - SCLo sclo
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/sclo/x86_64/sclo/
gpgcheck=0
enabled=1
EOF

还会报错,按下面修改

YUM 配置文件中的变量 $releasever 在 CentOS 7 下会自动替换为数字 7。但在阿里云镜像站的 centos-vault(归档库)中,CentOS 7 的实际目录名称是具体的终极版本号 7.9.2009,并没有 /centos-vault/7/ 这个路径,因此服务器直接返回了 404 Not Found。

🛠️ 解决方案
直接跳过变量替换,将 CentOS-Base.repo 中的路径硬编码指定为归档路径 7.9.2009。

  1. 重新写入正确的 CentOS 基础归档源
    请在终端中复制并运行以下命令,覆盖 /etc/yum.repos.d/CentOS-Base.repo:

Bash
sudo cat << 'EOF' > /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-7.9.2009 - Base
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1

[updates]
name=CentOS-7.9.2009 - Updates
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1

[extras]
name=CentOS-7.9.2009 - Extras
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1

[centosplus]
name=CentOS-7.9.2009 - Plus
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF

  1. 修复 EPEL 扩展源(从截图看系统启用了 EPEL)
    EPEL 7 同样已经进入 EOL 归档状态,如果不更新 EPEL 配置,后续也会触发 404。运行以下命令更新 EPEL 归档源:

Bash
sudo cat << 'EOF' > /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.aliyun.com/epel-archive/7/$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
EOF

  1. 清理并重构 YUM 缓存
    执行以下命令,完成缓存刷新:

Bash
sudo yum clean all
sudo yum makecache
提示 Metadata Cache Created 后,YUM 源即恢复正常使用。

二、安装python3

通过 EPEL 或 SCL 源快速安装(省时省力)
如果对 Python 版本没有极高要求,可以通过包管理器直接安装官方编译好的软件包。

方式 A:通过 EPEL 源安装 Python 3.6
Bash

1. 安装 EPEL 源

sudo yum install -y epel-release

2. 安装 Python 3 和 pip

sudo yum install -y python3 python3-pip

3. 验证

python3 --version

通过该方法安装的python的卸载方法

如果是通过 EPEL 源安装的 Python 3.6(yum install python3 python3-pip),卸载方式如下(适用于 CentOS/RHEL 7 系列等):

  1. 查看当前安装的 Python 包

先确认包名:

rpm -qa | grep python3

通常会看到类似:

python3-3.6.xxxxx.el7.x86_64
python3-libs-3.6.xxxxx.el7.x86_64
python3-pip-9.xxxxx.el7.noarch
python3-setuptools-...

  1. 卸载 Python 3 和 pip

执行:

sudo yum remove -y python3 python3-pip

如果提示依赖关系,也可以直接卸载相关包:

sudo yum remove -y python3*

  1. 删除 EPEL 源(如果不再需要)

卸载 EPEL:

sudo yum remove -y epel-release

或者:

sudo rpm -e epel-release

  1. 清理缓存
    sudo yum clean all
  2. 验证卸载

检查:

python3 --version

正常应该显示:

-bash: python3: command not found

检查 pip:

pip3 --version

应该也是:

-bash: pip3: command not found
注意

如果这是 CentOS 7 系统自带环境,不要删除:

python

因为 CentOS 7 的系统工具(如 yum)依赖 Python 2.7。

不要执行:

yum remove python

否则可能导致 yum 损坏。

如果你的目标是清理旧 Python 3.6,然后安装 Python 3.9/3.10/3.11,建议只卸载 python3 和 python3-pip,保留 EPEL 源。

方式 B:通过 SCL (Software Collections) 安装更高版本(如 Python 3.8)
SCL 允许在不破坏系统原有环境的前提下使用新版软件:

Bash

1. 安装 SCL 源

sudo yum install -y centos-release-scl

2. 安装 Python 3.8

sudo yum install -y rh-python38

3. 启用 Python 3.8 环境(仅在当前 Shell 终端生效)

scl enable rh-python38 bash

4. 验证

python --version

通过该方法安装的python的卸载

如果是通过 SCL(Software Collections)安装的 Python 3.8(rh-python38),卸载方式如下。

适用于 CentOS 7 / RHEL 7 使用 centos-release-scl 或 SCL 仓库的情况。

  1. 查看已安装的 SCL Python 包

先确认安装情况:

rpm -qa | grep rh-python38

一般会看到:

rh-python38-3.8.xxxxx.el7.x86_64
rh-python38-python-3.8.xxxxx.el7.x86_64
rh-python38-python-libs-...
rh-python38-python-pip-...
rh-python38-python-setuptools-...

  1. 卸载 Python 3.8

执行:

sudo yum remove -y rh-python38*

或者:

sudo yum erase -y rh-python38*

这会删除:

Python 3.8 主程序
pip
setuptools
标准库
相关依赖包

  1. 卸载 SCL 仓库(可选)

如果以后不再使用 SCL:

sudo yum remove -y centos-release-scl

如果安装了 SCL-utils:

sudo yum remove -y scl-utils

  1. 清理 yum 缓存
    sudo yum clean all
  2. 删除用户环境配置(如果配置过)

如果之前执行过:

scl enable rh-python38 bash

它只影响当前 Shell,不会永久生效。

但如果你添加过:

source /opt/rh/rh-python38/enable

例如在:

~/.bashrc
~/.bash_profile
/etc/profile

里面,需要删除:

source /opt/rh/rh-python38/enable

然后重新加载:

source ~/.bashrc

  1. 验证卸载

检查:

python --version

如果系统没有其他 Python:

-bash: python: command not found

检查:

scl -l

正常不会再显示:

rh-python38
注意事项

不要删除系统 Python:

python-2.7

CentOS 7 的:

yum
firewalld
系统管理脚本

依赖 Python 2.7。

不要执行:

yum remove python

否则可能导致 yum 无法使用。

如果你的目标是彻底清理所有第三方 Python(EPEL Python3 + SCL Python3.8)并恢复 CentOS 默认 Python 环境,可以执行:

sudo yum remove -y python3* rh-python38*
sudo yum remove -y centos-release-scl epel-release
sudo yum clean all

然后确认:

python --version
yum --version

都正常即可。

最佳实践建议

统一使用 python3 和 pip3 命令:在编写脚本、运行程序或安装第三方包时,显式指定 python3 script.py 或 pip3 install ,杜绝使用 python 混淆版本。

使用虚拟环境(Virtualenv):为具体的 Python 项目创建独立的环境,避免污染全局环境:

Bash
python3 -m venv my_env
source my_env/bin/activate
🚑 补充救急:如果误改 /usr/bin/python 导致 yum 报错怎么办?
如果你此前不小心替换了系统的 /usr/bin/python 软链接,导致运行 yum 时出现类似 SyntaxError: invalid syntax 的报错,请按以下步骤修复:

将软链接重新指回 Python 2.7:

Bash
sudo ln -sf /usr/bin/python2.7 /usr/bin/python
如果修改了配置文件,可以手动修正 yum 的解释器路径:
修改 /usr/bin/yum 和 /usr/libexec/urlgrabber-ext-down 文件的第一行,确保第一行为:

Bash

!/usr/bin/python2.7

标签: none

添加新评论