centos中yum指令报错No module named yum修复方法(踩坑无数)

此次问题通过百度无法完全解决,在此记录。

首先说明yum是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装(来源于百度百科)。正常情况下centos会内置yum工具,可直接使用。

问题现象:运行`yum list installed | grep vnc`查看vnc是否安装,常规情况会显示名字中包含vnc的已安装软件,然而报错如下:

即“No module named yum”问题。

干货:

原理:yum依赖于python,运行yum指令实际上是在python环境调用yum库运行后续指令;

报错原因:通常是安装了高版本的python替换了系统内置的,由于版本高,库没有,导致没法使用。本文记录了第二种情况,即yum知道在哪运行python,但是python找不到yum库了。

常规原因的解决方法:

1、运行`whereis python`查看python在哪里,通常在/usr/bin目录下;

?2、‘vim /usr/bin/yum’把“#!/usr/bin/python”修改为系统之前内置的python版本,通常是“#!/usr/bin/python2.7”;具体要根据第一步返回的结果来判断;

若上述方法未能解决,或者已经把系统的python和yum全干掉了,采用如下方法:

1、先去/usr/local/bin目录下看有没有Python相关的文件夹,如果有,删掉,再运行yum试试;

2、还是报错的话,运行`whereis python`和`whereis yum`查看python和yum在哪里,若没有,说明都被干掉了,去http://vault.centos.org根据你的系统版本号(通过`rpm -q centos-release`查看系统版本),依次进入/os/x86_64/Packages页面,下载如下文件(注意,不同系统版本的文件版本不同,不要直接复制搜索,可通过前几个单词进行搜索)

rpm-python-4.11.3-21.el7.x86_64.rpm

rpm-4.11.3-21.el7.x86_64.rpm

python-urlgrabber-3.10-8.el7.noarch.rpm

python-setuptools-0.9.8-4.el7.noarch.rpm

python-pycurl-7.19.0-19.el7.x86_64.rpm

python-libs-2.7.5-48.el7.x86_64.rpm

python-ipaddress-1.0.16-2.el7.noarch.rpm

python-iniparse-0.4-9.el7.noarch.rpm

python-devel-2.7.5-48.el7.x86_64.rpm

python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch.rpm

python-backports-1.0-8.el7.x86_64.rpm

python-2.7.5-48.el7.x86_64.rpm

yum-plugin-fastestmirror-1.1.31-40.el7.noarch.rpm

yum-metadata-parser-1.1.4-10.el7.x86_64.rpm

yum-3.4.3-150.el7.centos.noarch.rpm

在服务器自己建一个文件夹,把这些文件放进去,在命令行切到文件夹,依次运行

```rpm --replacefiles --replacepkgs -ivh rpm-* python-* #覆盖安装

rpm --replacefiles --replacepkgs -ivh yum-*```

进行安装,安装完成后再次运行yum,已正常。如果还报错,可通过

1、删除现有Python?rpm?-qa|grep?python|xargs?rpm?-ev?--allmatches?--nodeps?##强制删除已安装程序及其关联?whereis?python?|xargs?rm?-frv?##删除所有残余文件?##xargs,允许你对输出执行其他某些命令?whereis?python?##验证删除,返回无结果2、删除现有的yum?rpm?-qa|grep?yum|xargs?rpm?-ev?--allmatches?--nodeps?whereis?yum?|xargs?rm?-frv

清除yum和python,再次通过上面的rpm包进行安装,安装完成后yum已正常。

以下是踩坑的心路历程,十分啰嗦,阅读请谨慎


通过搜索得知yum是依赖于python运行的,此报错说明python版本与yum版本不兼容,首先需要查看python版本,运行`python -V`结果再次报错:

原来系统连python都没有了!此时判断应该是有人误操作删掉了python相关的环境,这个好办,再装一个即可。搜索“centos安装python”,结果全是通过yum安装。。。然而本地连yum都运行不了啊。。。死锁了。。。

没关系,作为一个“熟练掌握常用编程工具安装与卸载”的工程师,直接用源码安装就行了,首先在命令行用

1、删除现有Python?rpm?-qa|grep?python|xargs?rpm?-ev?--allmatches?--nodeps?##强制删除已安装程序及其关联?whereis?python?|xargs?rm?-frv?##删除所有残余文件?##xargs,允许你对输出执行其他某些命令?whereis?python?##验证删除,返回无结果2、删除现有的yum?rpm?-qa|grep?yum|xargs?rpm?-ev?--allmatches?--nodeps?whereis?yum?|xargs?rm?-frv

把本地的清理掉【坑1:不该删除系统自带的python环境】,运行`rpm -q centos-release`查看系统版本(我的是7.3.1611),

在搜索结果中找到与系统版本对应的centos源镜像http://vault.centos.org/7.3.1611/os/x86_64/Packages(加载较慢),参考网上找的教程下载需要的python和yum有关的rpm包【坑2:大部分的教程内给的包名都不完全,会缺依赖】,在服务器新建文件夹把rpm包放进去,切换文件夹运行

rpm?--replacefiles?--replacepkgs?-ivh?rpm-*?python-*?#覆盖安装rpm?--replacefiles?--replacepkgs?-ivh?yum-*

进行安装,结果报错缺依赖

缺依赖那就安装好了,搜索对应的包名下载然后通过rpm再安装

结果安装过程中各种坑,很多包相互依赖,安装某依赖包的时候又有别的依赖,此时作为一个“熟练掌握常用编程工具安装与卸载”的工程师,我理所当然得想到可以去官网下载一个完整包安装,找到最新的python2.7(因为centos7内置的版本是python2)的tar包,下载到本地,传到服务器,解压编译安装一气呵成【坑3:不该用官方安装包】,运行`python`,熟悉的界面回来了

OK,心中窃喜,此时再切换到之前放yum的rpm包的文件夹运行`rpm --replacefiles --replacepkgs -ivh yum-*`

安装完毕,输入yum指令运行,结果

无语凝噎。。。

再次搜索该报错信息,发现原来是yum配置文件问题,参考网上的教程先运行`whereis python`查看python相关的文件在哪里

可以看到python在/usr/bin/python2.7,然后运行`vim /usr/bin/yum`修改配置信息,将头文件修改为#!/usr/local/bin/python2.7

保存退出,再次运行yum,依然报错。。。

好吧,再次在网上搜“centos如何重新安装python和yum”,搜到的都是使用源文件来安装的,此时我猜测使用官方包安装应该是不对的,于是再次尝试找源文件,几番尝试以后终于找到不缺依赖的文件名:

首先用命令删除原来装的python和yum【坑4:rpm的删除指令不能删除通过官方包安装的文件】,使用前面的安装命令进行安装,

安装完成后,运行yum,报错依旧。。。。几近崩溃

然而运行python是没有问题的,看来是yum找不到python在哪了,再次通过`whereis python`和`vim /usr/bin/yum`修改配置文件,保存,运行yum,报错依旧。。。

好吧,显然已有的教程是解决不了问题了,思考一下,/bin文件夹下放的是可执行文件结合报错信息,分析得出运行yum指令时应该是调用/usr/bin/yum文件

即在python环境下import yum库,图中的红色文字即是报错信息,既然报错“No module named yum”,说明缺少yum库文件,搜索“python 第三方库存放位置”,进入python环境,首先`import sys`,然后运行`sys.path`

找到有site-packages的目录(存放第三方库的目录),即“/usr/local/Python2.7/lib/python2.7/site-packages”,进去之后发现并没有yum的库,注意到此时运行的python环境是2.7.17即我之前安装的官方最新的python2版本,而我之前通过源文件安装的版本是2.7.5,此时我终于意识到rpm的删除指令是删除不了官方安装包释放的文件的!也就是说,通过源码安装的文件是直接存放在/usr/bin下,库文件是放在/usr/lib.python2.7目录下的(通过rpm安装的yum库存放在此),而通过官方安装包释放的文件是在/usr/local/Python2.7的目录下,且其中没有yum库。

OK,手动删除/usr/local/Python2.7目录,注意通过`vim usr/bin/`改回为"#!/usr/bin/python",再运行yum,终于看到熟悉的界面。。。。

此时只想说一句:纸上得来终觉浅,绝知此事要躬行。期间所有搜到的方法试了个遍,也是在这个过程get到yum和python的依存关系,提升了对linux系统的理解,故作此记录。