• Linux下如何切换多版本Python


    环境介绍:

    操作系统:CentOS 7

    正文:

    在升级httpd后,由于某些RPM版本较低,导致启动失败。因此需要用yum升级,当执行升级命令时,出现如下错误:

    1. [root@~]# yum install -y db4-devel expat-devel
    2. Loaded plugins: fastestmirror
    3. Determining fastest mirrors
    4. * epel: abqix.mm.fcix.net
    5. File "/usr/libexec/urlgrabber-ext-down", line 28
    6. except OSError, e:
    7. ^
    8. SyntaxError: invalid syntax
    9. File "/usr/libexec/urlgrabber-ext-down", line 28
    10. except OSError, e:
    11. ^
    12. SyntaxError: invalid syntax
    13. File "/usr/libexec/urlgrabber-ext-down", line 28
    14. except OSError, e:
    15. ^
    16. SyntaxError: invalid syntax
    17. Exiting on user cancel

    这个错误之前遇到过,第一时间就想到是python版本不对导致的。yum使用的python2.x,当前默认的python版本是3.x,如下图:

    1. [root@ ~]# python
    2. Python 3.6.8 (default, Nov 16 2020, 16:55:22)
    3. [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
    4. Type "help", "copyright", "credits" or "license" for more information.
    5. >>>

    一种简单粗暴的方法,就是直接将python的bin文件指向2.x版本。以下是搜索python得到的文件路径:

    1. [root@ ~]# whereis python
    2. 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的具体情况:

    1. [root@~ /]# cd /usr/bin
    2. [root@~ bin]# ll | grep python
    3. lrwxrwxrwx 1 root root 9 Mar 20 17:52 python -> python3.6
    4. lrwxrwxrwx. 1 root root 9 Aug 14 2017 python2 -> python2.7
    5. -rwxr-xr-x. 1 root root 7136 Nov 6 2016 python2.7
    6. -rwxr-xr-x 1 root root 11328 Apr 23 2021 python3
    7. -rwxr-xr-x 2 root root 11328 Nov 17 2020 python3.6
    8. -rwxr-xr-x 2 root root 11328 Nov 17 2020 python3.6m
    9. lrwxrwxrwx. 1 root root 7 Aug 14 2017 python_old27 -> python2

    由上面的内容可以看出,python文件是一个软链接,它链接的是python3.6的文件。所以,我们可以直接修改python的软链接指向2.7的文件即可。

    上面的方法就比较简单粗暴,下面介绍一种安装更友好的方法,使用update-alternatives命令来管理多版本的问题。

    以下是man update-alternatives命令输出的内容:

    1. UPDATE-ALTERNATIVES(8) System Manager's Manual UPDATE-ALTERNATIVES(8)
    2. NAME
    3. alternatives - maintain symbolic links determining default commands
    4. SYNOPSIS
    5. alternatives [options] --install link name path priority [--slave link name path]... [--initscript service] [--family name]
    6. alternatives [options] --remove name path
    7. alternatives [options] --set name path
    8. alternatives [options] --auto name
    9. alternatives [options] --display name
    10. alternatives [options] --config name
    11. alternatives [options] --list name

    所以,我们可以通过以下命令,对python进行多版本管理:

    1. update-alternatives --install /usr/bin/python python /usr/bin/python2.7 100
    2. update-alternatives --install /usr/bin/python python /usr/bin/python3.6 110
    3. # 参数介绍
    4. # 第一个参数: --install 添加软链接。
    5. # 第二个参数: 软链接的地址。
    6. # 第三个参数: 软链接的名字。
    7. # 第四个参数: 被管理的命令绝对路径。
    8. # 第五个参数: 优先级,数字越大优先级越高。

    设置成功之后,可使用以下命令来切换不同的版本了:

    update-alternatives --config python

    执行上述命令,会出现如下内容:

    1. [root@~]# update-alternatives --config python
    2. There are 2 programs which provide 'python'.
    3. Selection Command
    4. -----------------------------------------------
    5. + 1 /usr/bin/python2.7
    6. * 2 /usr/bin/python3.6
    7. Enter to keep the current selection[+], or type selection number:
    8. [root@ ~]# python
    9. Python 2.7.5 (default, Nov 6 2016, 00:28:07)
    10. [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
    11. Type "help", "copyright", "credits" or "license" for more information.

    通过输入数字,可以切换不同的版本。

    我们可以再次查看/usr/bin下python的目录情况:

    1. [root@~ bin]# ll |grep python
    2. lrwxrwxrwx 1 root root 24 Apr 2 18:54 python -> /etc/alternatives/python
    3. lrwxrwxrwx. 1 root root 9 Aug 14 2017 python2 -> python2.7
    4. -rwxr-xr-x. 1 root root 7136 Nov 6 2016 python2.7
    5. -rwxr-xr-x 1 root root 11328 Apr 23 2021 python3
    6. -rwxr-xr-x 2 root root 11328 Nov 17 2020 python3.6
    7. -rwxr-xr-x 2 root root 11328 Nov 17 2020 python3.6m
    8. lrwxrwxrwx. 1 root root 7 Aug 14 2017 python_old27 -> python2

    可以看到,此时/usr/bin/python已经被指向了/etc/alternatives/python,查看/etc/alternatives/python,得到如下结果:

    1. [root@ bin]# ll /etc/alternatives/python
    2. 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命令和我们前面讲的直接修改软链接的粗暴方式并无二异。

  • 相关阅读:
    集成测试、单元测试、系统测试的概念你都了解吗?
    SBCS MBCS Unicode三种编码方式?
    PHP反序列化与SESSION
    强化服务器安全!CentOS 7如何使用fail2ban防范SSH暴力破解攻击?
    JAVA SpringMVC老项目集成knife4j
    vue3+ts插槽的使用
    2010款雪佛兰科鲁兹车发动机怠速时车身振动明显
    成功解决ES高亮内容引起的字段显示不一致问题
    记一次使用流排序遇到的问题
    CentOS8.0搭建 RockerMq
  • 原文地址:https://blog.csdn.net/lhjlhj123123/article/details/137283328