事情还得从之前我的一次手欠说起,这一次手欠,给我后续带来了不少的麻烦事,昨天我跟腾讯云的客服一起折腾了一天都没解决,但我今天搞了一个Redhat订阅之后很快就找到了解决方法,由于事情较为漫长且命令输出较多,所以可能没多少可以用来说明具体情况的图片
在之前,我重装了服务器上面的python和yum,然后又安装了python3(centos7自带的是python2,3和2的语法有些不同,脚本文件不通用),还更改了默认的python版本,接着一堆报错就来了,最开始先是yum命令用不了,修改yum用的python版本之后算是能临时解决了这个问题,后来在一次安装软件的时候,有一个源一直用不了,报错(具体看图),然后我自行上网查找翻阅资料无果,与腾讯云客服沟通后无果,不过我当时就感觉是缺少python模块,但在安装的时候发现py2已经被我搞废了,执行pip2只能得到一堆python报错,这个模块在py3正常安装,但没用,因为yum用的是py2
最开始的报错截图
与腾讯云客服折腾无果之后草草禁用源的签名验证后结束了这一报错,接着处理下面这些”不影响使用“的not found报错
一些不影响使用的报错截图
一开始想着既然是找不到文件,那我把文件复制过来应该就可以了,结果当我把文件复制过来之后,文件是找到了,但是模块缺仍然无法加载
简单粗暴的复制文件之后
于是我就索性把服务器整个备份一下,然后安装网上的教程把py2的环境修一下,因为报错这玩意是无底洞的,但是Linux系统与python的结合非常紧密,尤其是centos/Redhat系列,软件包管理程序yum的本质上就是一个py脚本,修复这玩意真是“伤筋动骨”。修复完成之后按照Redhat的教程彻底修复了这些奇怪的报错。
以下是根据我执行的操作所写的教程,不保证通用,如果你的系统与我的相同,那你可以尝试照搬,否则请不要盲目复制粘贴命令,不然出了事后果自负。我的环境是跑在腾讯云的虚拟机上的centos7.9.2009,已设置腾讯云的内网dns,可以正常访问腾讯云的内网资源
1、修复python2.7环境以及yum[1]
先把现有的python彻底删干净,py2也好,py3也好,全都删干净,yum也删干净
代码语言:javascript复制#强制清除已安装的python程序及其关联,xargs,允许你对输出执行其他某些命令
rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps
#删除所有残余文件
whereis python |xargs rm -frv
#验证删除,返回无结果说明清除干净
whereis python
#卸载yum
rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps
#删除残余
whereis yum |xargs rm -frv
到现在,系统里面应该是没python了,也没yum了,接下来进到你自己的用户目录下面,创建一个自己喜欢的文件夹,然后进去,下载py2和yum的rpm包,需要下载的包有:
- device-mapper-1.02.170-6.el7.x86_64.rpm
- device-mapper-event-1.02.170-6.el7.x86_64.rpm
- device-mapper-event-libs-1.02.170-6.el7.x86_64.rpm
- device-mapper-libs-1.02.170-6.el7.x86_64.rpm
- epel-release-latest-7.noarch.rpm
- gpgme-devel-1.3.2-5.el7.x86_64.rpm
- libxml2-python-2.9.1-6.el7.5.x86_64.rpm
- lvm2-libs-2.02.187-6.el7.x86_64.rpm
- lvm2-python-libs-2.02.187-6.el7.x86_64.rpm
- python-2.7.5-89.el7.x86_64.rpm
- python2-rpm-macros-3-34.el7.noarch.rpm
- python-backports-1.0-8.el7.x86_64.rpm
- python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch.rpm
- python-chardet-2.2.1-3.el7.noarch.rpm
- python-devel-2.7.5-89.el7.x86_64.rpm
- python-iniparse-0.4-9.el7.noarch.rpm
- python-ipaddress-1.0.16-2.el7.noarch.rpm
- python-kitchen-1.1.1-5.el7.noarch.rpm
- python-libs-2.7.5-89.el7.x86_64.rpm
- python-pycurl-7.19.0-19.el7.x86_64.rpm
- python-rpm-macros-3-34.el7.noarch.rpm
- python-setuptools-0.9.8-7.el7.noarch.rpm
- python-srpm-macros-3-34.el7.noarch.rpm
- python-urlgrabber-3.10-10.el7.noarch.rpm
- python-virtualenv-15.1.0-4.el7_7.noarch.rpm
- rpm-4.11.3-45.el7.x86_64.rpm
- rpm-build-4.11.3-45.el7.x86_64.rpm
- rpm-build-libs-4.11.3-45.el7.x86_64.rpm
- rpm-libs-4.11.3-45.el7.x86_64.rpm
- rpm-python-4.11.3-45.el7.x86_64.rpm
- rpm-sign-4.11.3-45.el7.x86_64.rpm
- subscription-manager-1.24.42-1.el7.centos.x86_64.rpm
- yum-3.4.3-168.el7.centos.noarch.rpm
- yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
- yum-plugin-aliases-1.1.31-54.el7_8.noarch.rpm
- yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm
- yum-plugin-protectbase-1.1.31-54.el7_8.noarch.rpm
- yum-utils-1.1.31-54.el7_8.noarch.rpm
你需要去软件源镜像上面把上述这一堆包下载回来放到文件夹里,你可以选择在本地一个个下载回来然后再上传到服务器上,也可以直接在服务器上用wget命令一个个下载,至于从哪下,我的建议是谁家的服务器就从谁家的软件源下载,例如本例中我的服务器是腾讯云的,那我就选择从腾讯云的内网镜像源下载这些包,为了省事,我写了一个脚本来下载这些包,你可以执行以下命令来获取这些包(如果你的机子也是腾讯云的且能正常访问腾讯云的内网软件源的话)
代码语言:javascript复制#创建目录
mkdir yum
cd yum
#获取脚本
wget https://302.ba7jcm.top/upload/linux/centos/download.sh
#给脚本文件设置777权限(所有人可读可写可执行)
chmod 777 download.sh
#执行脚本
./download.sh
ls *.rpm
如果一切顺利的话应该能看到这样的画面,这说明文件都下载好了
正常情况下执行完脚本应该有这些文件
然后执行rpm -ivh --force --nodeps ./*
命令进行安装,安装完成后执行yum
命令看看能不能看到类似这样的输出
执行yum之后正常的样子
如果能看到这么一大堆正常的输出,而不是简单几句yum:xxx not found
,那就说明yum安装成功了,然后就可以执行清除软件源缓存、构建缓存、更新程序等操作,虽然还是有可能看到上面的xxx/xxx.conf not found
或者plugin "xxx" can't be import
的报错,但这不影响yum的使用,至此,py2环境和yum的修复基本就算是完成了
2、安装python3并与python2共存[2]
目前py2已经安装好了,但pip还得自己另外安装,执行以下命令安装并升级到最新的pip2
代码语言:javascript复制#先用yum安装pip2
yum install epel-release python-pip -y
#获取更新pip2的脚本并执行,两组命令二选一,同一个文件,不同的源而已
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python get-pip.py
wget https://302.ba7jcm.top/upload/Linux/get-pip2.py
python get-pip2.py
#查看pip版本
pip -V
如果一切顺利,那么你在查看pip版本时将能看到类似于下面这样的输出:
查看pip2版本
接下来就是获取py3的源码并编译安装
代码语言:javascript复制#先安装依赖
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y
安装完依赖之后去python官网ftp地址挑一个自己喜欢的版本并通过wget命令下载到你服务器上,或者使用wget https://302.ba7jcm.top/upload/linux/Python-3.9.7.tar.xz
命令从我网盘下载我用的py3.9.7到服务器本地,以下操作均以我用的397版本为例,若使用的版本不同请自行更改命令中的版本号
#解压下载回来的压缩包
tar -xvJf Python-3.9.7.tar.xz
#进入解压后的文件夹
cd Python-3.9.7/
#编译py3
./configure prefix=/usr/local/python3
#安装py3
make && make install
#设置软链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
#测试安装结果以及软链接设置的结果
python3
#安装完看一下yum是否还正常
yum
#进入py3的安装路径
cd /usr/local/python3/bin/
#配置pip3的软链接
ll pip*
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
#更新pip3
pip3 install --upgrade pip
#验证结果
pip3 -V
如果能看到类似于下图的结果,则说明pip3更新成功
查看pip3版本
更新pip3也有类似于更新pip2的那种方式,执行以下代码同样可以更新pip3到最新版
代码语言:javascript复制wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
#或者从我网盘下载更新脚本
wget https://302.ba7jcm.top/upload/linux/get-pip3.py
python3 get-pip3.py
到这里的话py的2和3的共存安装基本就算是完成了,但是执行yum的时候仍然会有一些报错
代码语言:javascript复制Plugin "product-id" can't be imported
Plugin "search-disabled-repos" can't be imported
Plugin "subscription-manager" can't be imported
3、修复插件报错[3]
虽然这些插件的报错并不影响使用,但是看着很烦,目前上网查找资料,免费的资料基本没用,要么就直接无视了这个报错,要么就是提供的方法无效,而且与我的报错也有少许出入,唯一一个与我的报错吻合的资料是Redhat官网的,但这玩意要Redhat订阅才给看,于是我根据教程[4]白嫖了一个Redhat订阅,成功的解决了这个问题,根据资料上的说法,似乎是因为python-six这个软件包的问题,下面附上英文原文以及谷歌翻译版
英文原文:
The errors can be output with several causes, and it’s possibly affected by 3rd party python file. The six.py
file was one example, which happened in a customer’s site. /usr/lib/python2.6/site-packages/six.py
in python-six-1.9.0-2.el6.noarch
package is provided by Red Hat. When /usr/bin/six.pyc
existed, and it was used in the yum command instead of one provided by Red Hat. It was the root cause for the errors. The issue also occurs if you uses python-six v.1.3.x. Updating to python-six-1.9.0-2 fixes the issue.
谷歌翻译版:
代码语言:javascript复制输出错误的原因有多种,可能受第三方 python 文件的影响。
Six.py 文件就是一个例子,它发生在客户的站点中。
python-six-1.9.0-2.el6.noarch 包中的 /usr/lib/python2.6/site-packages/six.py 由 Red Hat 提供。
当 /usr/bin/six.pyc 存在时,它被用于 yum 命令而不是 Red Hat 提供的命令。 这是错误的根本原因。
如果您使用 python-6 v.1.3.x,也会出现此问题。 更新到 python-six-1.9.0-2 解决了这个问题。
Redhat资料里面给出的解决方法是更新python-six软件包并检查yum里面是否使用了第三方的python文件,这是资料中给出的修复命令:
代码语言:javascript复制yum update python-six
strace -ttTvf -o /tmp/yum.strace -s 512 yum update
我在执行完这两行命令之后还执行了卸载python-six和安装python-six的命令,并且在执行的时候发现报错已经消失了,同时yum已可以正常加载这些插件了,如图所示
彻底修复了yum
4、修复pygpgme
经过这一系列的折腾,我服务器上面的centos7算是被我弄的没什么报错了,然后我恢复了在之前与腾讯云客服的折腾中禁用掉的源签名验证,熟悉的报错再次出现在眼前,然后我就用pip2安装了pygpgme之后,源的签名验证恢复了正常,接下来就报说那个源没有导入签名,导入之后就正常了,目前已经没有东西因为报错而被禁用,也没有别的新的报错出现,整个服务器已经基本算是恢复正常了。
参考资料:
- centos7 误删除python2后yum不能用 恢复过程_Kerry.Zhang的博客-CSDN博客
- centos7 python2和python3共存 – 一本正经的搞事情 – 博客园
- yum can’t import “product-id” and “subscription-manager” plugins – Red Hat Customer Portal
- RedHat免费订阅账号注册方式_iamwayne10的博客-CSDN博客