操作系统:CentOS 7
在升级httpd后,由于某些RPM版本较低,导致启动失败。因此需要用yum升级,当执行升级命令时,出现如下错误:
- [root@~]# yum install -y db4-devel expat-devel
- Loaded plugins: fastestmirror
- Determining fastest mirrors
- * epel: abqix.mm.fcix.net
- File "/usr/libexec/urlgrabber-ext-down", line 28
- except OSError, e:
- ^
- SyntaxError: invalid syntax
- File "/usr/libexec/urlgrabber-ext-down", line 28
- except OSError, e:
- ^
- SyntaxError: invalid syntax
- File "/usr/libexec/urlgrabber-ext-down", line 28
- except OSError, e:
- ^
- SyntaxError: invalid syntax
-
-
- Exiting on user cancel
这个错误之前遇到过,第一时间就想到是python版本不对导致的。yum使用的python2.x,当前默认的python版本是3.x,如下图:
- [root@ ~]# python
- Python 3.6.8 (default, Nov 16 2020, 16:55:22)
- [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
- Type "help", "copyright", "credits" or "license" for more information.
- >>>
一种简单粗暴的方法,就是直接将python的bin文件指向2.x版本。以下是搜索python得到的文件路径:
- [root@ ~]# whereis python
- python: /usr/bin/python /usr/bin/python2.7 /usr/bin/python3.6 /usr/bin/python3.6m /usr/lib/python2.7 /usr/lib/python3.6 /usr/lib64/python3.6 /usr/lib64/python2.7 /etc/python /usr/local/lib/python3.6 /usr/include/python2.7 /usr/include/python3.6m /usr/share/man/man1/python.1.gz
我们到/usr/bin目录下,看看python的具体情况:
- [root@~ /]# cd /usr/bin
- [root@~ bin]# ll | grep python
- lrwxrwxrwx 1 root root 9 Mar 20 17:52 python -> python3.6
- lrwxrwxrwx. 1 root root 9 Aug 14 2017 python2 -> python2.7
- -rwxr-xr-x. 1 root root 7136 Nov 6 2016 python2.7
- -rwxr-xr-x 1 root root 11328 Apr 23 2021 python3
- -rwxr-xr-x 2 root root 11328 Nov 17 2020 python3.6
- -rwxr-xr-x 2 root root 11328 Nov 17 2020 python3.6m
- lrwxrwxrwx. 1 root root 7 Aug 14 2017 python_old27 -> python2
由上面的内容可以看出,python文件是一个软链接,它链接的是python3.6的文件。所以,我们可以直接修改python的软链接指向2.7的文件即可。
上面的方法就比较简单粗暴,下面介绍一种安装更友好的方法,使用update-alternatives命令来管理多版本的问题。
以下是man update-alternatives命令输出的内容:
- UPDATE-ALTERNATIVES(8) System Manager's Manual UPDATE-ALTERNATIVES(8)
- NAME
- alternatives - maintain symbolic links determining default commands
- SYNOPSIS
- alternatives [options] --install link name path priority [--slave link name path]... [--initscript service] [--family name]
- alternatives [options] --remove name path
- alternatives [options] --set name path
- alternatives [options] --auto name
- alternatives [options] --display name
- alternatives [options] --config name
- alternatives [options] --list name
所以,我们可以通过以下命令,对python进行多版本管理:
- update-alternatives --install /usr/bin/python python /usr/bin/python2.7 100
- update-alternatives --install /usr/bin/python python /usr/bin/python3.6 110
-
- # 参数介绍
- # 第一个参数: --install 添加软链接。
- # 第二个参数: 软链接的地址。
- # 第三个参数: 软链接的名字。
- # 第四个参数: 被管理的命令绝对路径。
- # 第五个参数: 优先级,数字越大优先级越高。
设置成功之后,可使用以下命令来切换不同的版本了:
update-alternatives --config python
执行上述命令,会出现如下内容:
- [root@~]# update-alternatives --config python
-
- There are 2 programs which provide 'python'.
-
- Selection Command
- -----------------------------------------------
- + 1 /usr/bin/python2.7
- * 2 /usr/bin/python3.6
-
- Enter to keep the current selection[+], or type selection number:
- [root@ ~]# python
- Python 2.7.5 (default, Nov 6 2016, 00:28:07)
- [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
- Type "help", "copyright", "credits" or "license" for more information.
通过输入数字,可以切换不同的版本。
我们可以再次查看/usr/bin下python的目录情况:
- [root@~ bin]# ll |grep python
- lrwxrwxrwx 1 root root 24 Apr 2 18:54 python -> /etc/alternatives/python
- lrwxrwxrwx. 1 root root 9 Aug 14 2017 python2 -> python2.7
- -rwxr-xr-x. 1 root root 7136 Nov 6 2016 python2.7
- -rwxr-xr-x 1 root root 11328 Apr 23 2021 python3
- -rwxr-xr-x 2 root root 11328 Nov 17 2020 python3.6
- -rwxr-xr-x 2 root root 11328 Nov 17 2020 python3.6m
- lrwxrwxrwx. 1 root root 7 Aug 14 2017 python_old27 -> python2
可以看到,此时/usr/bin/python已经被指向了/etc/alternatives/python,查看/etc/alternatives/python,得到如下结果:
- [root@ bin]# ll /etc/alternatives/python
- lrwxrwxrwx 1 root root 18 Apr 2 18:54 /etc/alternatives/python -> /usr/bin/python3.6
/etc/alternatives/python也是一个软链接,其指向 /usr/bin/python3.6。由此看来,update-alternatives命令和我们前面讲的直接修改软链接的粗暴方式并无二异。