Ubuntu有一个update-alternatives命令,对于一些命令或程序,如果有多个版本,可以通过该命令指定优先级并快速切换。以Python为例,在ubuntu下,你可以查看不同版本的路径:
ubuntu@ip-172-31-7-11:~$ whereis python2 python2: /usr/bin/python2 /usr/bin/python2.7 /usr/lib/python2.7 /etc/python2.7 /usr/local/lib/python2.7 /usr/share/man/man1/python2.1.gz ubuntu@ip-172-31-7-11:~$ whereis python3 python3: /usr/bin/python3 /usr/bin/python3.6m /usr/bin/python3.6 /usr/lib/python3.7 /usr/lib/python3 /usr/lib/python3.6 /usr/lib/python3.8 /etc/python3 /etc/python3.6 /usr/local/lib/python3.6 /usr/share/python3 /usr/share/man/man1/python3.1.gz ubuntu@ip-172-31-7-11:~$ ls -l /usr/bin/python2 lrwxrwxrwx 1 root root 9 Apr 16 2018 /usr/bin/python2 -> python2.7
可见/usr/bin/pythonN是一个链接文件,指向同一目录下对应的版本号,同样地,系统默认的python也是个链接文件,它的指向决定了该命令运行哪一个版本的ptyhon。
ubuntu@ip-172-31-7-11:~$ which python /usr/bin/python ubuntu@ip-172-31-7-11:~$ which python2 /usr/bin/python2 ubuntu@ip-172-31-7-11:~$ which python3 /usr/bin/python3
可见,如果不加版本号,运行python命令,实际上是如/usr/bin/python这个链接文件的指向来决定版本号的。
update-alternatives这个命令的用法f示例如下:
sudo update-alternatives --install /usr/local/bin/python python /usr/bin/python2 20
其中:/usr/local/bin/python是python二进制程序的路径,当然你也可以用系统默认的/usr/bin/python,只不过从linux的用户空间程序角度来看,/usr/local/bin/python更符合规范,我们也顺便看看有什么效果,默认并没有这个路径,而不是/usr/bin/python已经被系统指定了链接路径。而后面的python就是二进制命令或程序本身名称,后面的/usr/bin/python2 20分别指定了版本和优先权。
一、首先查看一下当前ubuntu系统的python相关版本及配置路径:
whereis python
把结果截个图,后面有用。
二、查看当前默认的python版本,直接打python可,用ctrl+D退出
三、 添加python版本的优先级到列表
ubuntu@ip-172-31-7-11:/usr/local/bin$ sudo update-alternatives --install /usr/local/bin/python python /usr/bin/python2 20 update-alternatives: using /usr/bin/python2 to provide /usr/local/bin/python (python) in auto mode ubuntu@ip-172-31-7-11:/usr/local/bin$ sudo update-alternatives --install /usr/local/bin/python python /usr/bin/python3 40 update-alternatives: using /usr/bin/python3 to provide /usr/local/bin/python (python) in auto mode
当然,你也可以用更多更细的版本来作为python命令所用的版本,无非就是更改上面这优先权之前的那个具体版本路径,
接下来,就可以查询python的各替代命令优先权了
ubuntu@ip-172-31-7-11:/usr/local/bin$ update-alternatives --query python Name: python Link: /usr/local/bin/python Status: auto Best: /usr/bin/python3 Value: /usr/bin/python3 Alternative: /usr/bin/python2 Priority: 20 Alternative: /usr/bin/python3 Priority: 40
auto就是自动选择优选择高的那个版本,这里best就是优先权为40的这个版本,也就是python3, 我们可以用下面命令验证
ubuntu@ip-172-31-7-11:/usr/local/bin$ which python /usr/local/bin/python ubuntu@ip-172-31-7-11:/usr/local/bin$ python Python 3.6.9 (default, Mar 15 2022, 13:55:28) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 按ctrl+D退出pyton命令行
可见,python的优先权已经设置好了,如果平时需要临时更改,如何操作呢?如下所示:
ubuntu@ip-172-31-7-11:/usr/local/bin$ sudo update-alternatives --config python There are 2 choices for the alternative python (providing /usr/local/bin/python). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/bin/python3 40 auto mode 1 /usr/bin/python2 20 manual mode 2 /usr/bin/python3 40 manual mode Press to keep the current choice[*], or type selection number: 1 update-alternatives: using /usr/bin/python2 to provide /usr/local/bin/python (python) in manual mode ubuntu@ip-172-31-7-11:/usr/local/bin$ python Python 2.7.17 (default, Mar 18 2022, 13:21:42) [GCC 7.5.0] on linux2 Type "help", "copyright", "credits" or "license" for more information.
通过这个update-alternatives命令,我们可以很方便地在python的不同的版本间切换。