系统环境:Centos 7.8
1. 问题场景
想在测试环境的 Linux 安装一个查看端口的软件:
yum install lsof
Oops!然后报错如下:
File "/usr/bin/yum", line 30
   except KeyboardInterrupt, e:
                           ^
SyntaxError: invalid syntax
2. 原因分析
Google 开始 solo ,都说是 Python 的兼容性问题,需要修改为 Python 2.x 版本,不支持 Python 3.x。但是那不应该呀,刚装完的时候是能用的,后来沟通才发现是有人折腾过 Python 3.x,因为某些软件必须 Python 3.x 才能使用。
经过对比发现,在
Centos 7.x版本中,yum使用的Python版本都是2.x的(也是系统默认的),到了Centos 8及之后yum使用的才是3.x版本(同时也是系统默认)。
【注】Python 2 与 3 是劝退并不学 Python 的原因,等 Golang 玩的差不多了,到时候估计也要搞搞 Python 了,卷起来!!!
3. 解决方案
3.1 仅解决 yum 的问题
此方法适用于 Centos 7 上有重要程序需要依赖 Python 3.x 的场景,否则就会导致程序不能正常使用。但是这仅仅是解决了 yum 的使用,如果有其他系统软件必须 Python 2.x 的话,那就只能遇到一个改一个;但是一般来说常用的也就那几个命令,服务器跑的好好的一般没人折腾它,哈哈。
But, 如果的确需要折腾服务器,而安装的依赖于 Python 3.x 的程序并不是说特别重要,可以参考 方法 3.2 的方法,直接修改环境变量将系统的 Python 版本指定为 2.x。
修改 yum 文件
vim /usr/bin/yum
#!/usr/bin/python
import sys
try:
    import yum
except ImportError:
....
....
[root@localhost system]# py    # 按 Tab 键,提示系统中已经安装的 Python。
pydoc             python2           python2.7-config  python-config     
python            python2.7         python2-config  
=>>>> 因为 python 已经被指向 python 3.x,所以这里直接指定 python 版本为 2.x;
#!/usr/bin/python2.7
import sys
try:
    import yum
except ImportError:
....
....
修改 urlgrabber-ext-down 文件
因为 yum update/install 等命令会涉及到外部下载东西,所以还需要修改 urlgrabber-ext-down,只修改 yum 的话,该命令也会报错。
操作方法与修改 yum 文件一样,替换掉顶部的 Python 版本。
vim /usr/libexec/urlgrabber-ext-down
#! /usr/bin/python
#  A very simple external downloader
#  Copyright 2011-2012 Zdenek Pavlas
....
....
=>>>> 修改如下(确保系统变量中有相应的环境变量):
vim /usr/libexec/urlgrabber-ext-down
#! /usr/bin/python2.7
#  A very simple external downloader
#  Copyright 2011-2012 Zdenek Pavlas
....
....
收工!!!
3.2 修改系统环境变量
方法 3.1 方法和本方法都可以解决问题,请根据实际场景选择即可。
# 进入 /usr/bin 目录
cd /usr/bin
# 查看默认 python 对应的软链接
ll | grep python
# 因为被人改过,所有这里指向了 python 3.x 版本
lrwxrwxrwx. 1 root root         38 Feb 21 09:40 python -> /home/module/python-3.8.15/bin/python3
lrwxrwxrwx. 1 root root          9 Jun 12  2020 python2 -> python2.7
-rwxr-xr-x. 1 root root       7144 Apr  2  2020 python2.7
lrwxrwxrwx. 1 root root         38 Feb 21 09:25 python3 -> /home/module/python-3.8.15/bin/python3
操作也比较简单,直接删除原有软链接,并新建一个指向 python 2.x 的软链接即可,因为 Centos 7.8 已经有默认的 Python 了,所以直接指向已有的即可。
rm /usr/bin/python
ln -s /usr/bin/python2.7 /usr/bin/python
ll | grep python
lrwxrwxrwx. 1 root root         38 Feb 21 09:40 python -> python2.7
lrwxrwxrwx. 1 root root          9 Jun 12  2020 python2 -> python2.7
-rwxr-xr-x. 1 root root       7144 Apr  2  2020 python2.7
lrwxrwxrwx. 1 root root         38 Feb 21 09:25 python3 -> /home/module/python-3.8.15/bin/python3
这样就可以了,系统环境默认使用的是 python(python 2.x) 版本,如果需要使用 python 3.x 的软件直接修改为 python3 即可(如果没有则需要创建一个 python3 的软链接),