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

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

    问题现象:运行 yum list installed | grep vnc 查看vnc是否安装,常规情况会显示名字中包含vnc的已安装软件,然而报错如下:
    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图1
    即“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 pythonwhereis 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

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

    2、删除现有的yum

    1. rpm -qa|grep yum|xargs
    2. rpm -ev --allmatches --nodeps
    3. whereis yum |xargs rm -frv

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

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


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

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图2
    原来系统连python都没有了!此时判断应该是有人误操作删掉了python相关的环境,这个好办,再装一个即可。搜索 centos安装python ,结果全是通过yum安装。。。然而本地连yum都运行不了啊。。。死锁了。。。
    没关系,作为一个“熟练掌握常用编程工具安装与卸载”的工程师,直接用源码安装就行了,首先在命令行用
    前面的方法把本地的python和yum清理掉【坑1:不该删除系统自带的python环境】,运行 rpm -q centos-release 查看系统版本(我的是7.3.1611),

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

    1. rpm --replacefiles --replacepkgs -ivh rpm-* python-* #覆盖安装
    2. rpm --replacefiles --replacepkgs -ivh yum-*

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

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图4
    缺依赖那就安装好了,搜索对应的包名下载然后通过rpm再安装

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

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图6
    OK,心中窃喜,此时再切换到之前放yum的rpm包的文件夹运行 rpm --replacefiles --replacepkgs -ivh yum-*

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图7
    安装完毕,输入yum指令运行,结果

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图8
    无语凝噎。。。

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

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图9
    可以看到 python在/usr/bin/python2.7 ,然后运行 vim /usr/bin/yum 修改配置信息,将头文件修改为 #!/usr/local/bin/python2.7

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图10
    保存退出,再次运行yum,依然报错。。。

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

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图11
    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图12
    首先用命令删除原来装的python和yum【坑4:rpm的删除指令不能删除通过官方包安装的文件】,使用前面的安装命令进行安装,

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图13
    安装完成后,运行yum,报错依旧。。。。几近崩溃

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

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

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图14
    即在python环境下import yum库,图中的红色文字即是报错信息,既然报错“No module named yum”,说明缺少yum库文件,搜索“python 第三方库存放位置”,进入python环境,首先 import sys ,然后运行 sys.path

    centos中yum指令报错No module named yum修复方法(踩坑无数) - 图15
    找到有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,终于看到熟悉的界面。。。。

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

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