需求背景

用过 Python 的都知道,Python 是不向后兼容的,也就是 Python3.X 开发的程序,使用 Python2.X 环境就无法正常运行。因为很多语法都改变了。现在接触到的大部分 Python 程序都是 Python3.X 开发的,但是偶尔也会遇到使用 Python2.X 的时候。这就需要灵活切换版本。

一般 Linux 的各个发行版都预装了 Python2.X。我使用的 Debian 就预装了 Python2.7。

$ python -V
Python 2.7.16

但是我同时也安装了 Python3.7

$ ls /usr/bin | grep "python*"
dh_python2
python
python2
python2.7
python3
python3.7
python3.7m
python3m

alias 修改别名

$ alias python=/usr/bin/python3
$ python -V
Python 3.7.3  

上面的别名修改只对当前终端有效。如果要使每个窗口都使用这个别名,将别名加入~/.bashrc,如 zsh 是则是~/.zshrc

软链接

和修改别名类似

ln -s python /usr/bin/python3

update-alternatives

update-alternatives是 Debian 系统提供的一个工具,Ubuntu 是基于 Debian 的,所以 Ubuntu 也可以使用,其他发行版没有该工具。它可以用来方便快捷地切换应用版本,不仅仅用来切换 Python,其他应用程序有多个版本的也可以使用该工具。

update-alternatives本质也是建立软链接,只不过有了统一的管理,首先我们需要使用--install参数,添加一些候选项,也就是执行python这个命令时,它可以有哪些选择,在这里就是python3.7.3python2.7.16两个选择。

# --install <链接> <名称> <路径> <优先级>
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1

注意,这里的/usr/bin/python链接文件,两个可选项必须是一样的,这样这个链接文件才可以选择两个不同的可选项去链接。

python是在命令行执行的命令。/usr/bin/python2.7是执行python命令后调用具体哪个版本。最后的数字2是优先级,也就是python2.7python3.7优先级高,如果不指定版本,那么默认就是使用python2

我们再查看一下版本信息,发现是python2.7.16。说明是默认版本。并且python已被链接到我们管理的软链接上。

$ python -V
Python 2.7.16

$ ll /usr/bin  | grep "python"
lrwxrwxrwx 1 root   python -> /etc/alternatives/python

查看python的可选配置,可以看到有两个可选配置,默认是python2,第一列是序号,如果我们想切换到python3,对应的数字2即可。

root at RISCX in ~
$ update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python2.7   2         auto mode
  1            /usr/bin/python2.7   2         manual mode
  2            /usr/bin/python3.7   1         manual mode

Press <enter> to keep the current choice[*], or type selection number:2
update-alternatives: using /usr/bin/python3.7 to provide /usr/bin/python (python) in manual mode

再次查看版本信息,发现已经切换成功。

$ python -V
Python 3.7.3

执行update-alternatives经常会导致我的终端回车失效,可以参考解决 Linux 终端回车键变成字符 M

--remove,删除可选项:

sudo update-alternatives --remove python /usr/bin/python2.7