需求背景
用过 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.3
和python2.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.7
比python3.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