1. 程式人生 > >linux下切換python2和python3

linux下切換python2和python3

本篇博文面向Linux使用者,在Linux下(Ubuntu)下測試通過,Win使用者嘛,……

0x00 為什麼需要有兩個版本的Python

Python2和Python3不相容是每個接觸過Python的開發者都知道的事,雖說Python3是未來,但是仍然有很多專案採用Python2開發。Linux的許多發行版本(如Ubuntu)都會自帶Python2.7,但是當我們準備開發一個Python3專案的時候,我們該怎麼辦?

那就把Python3也下咯。嗯,Linux下確實是可以兩個一起裝的,但是問題是你怎麼切換兩個版本的Python。

0x01 修改別名

首先先來看一下我們的預設Python版本

$ python
--version Python 2.7.6

然後我們修改一下別名

$ alias python='/usr/bin/python3'
$ python --version
Python 3.4.3  # 版本已經改變

/usr/bin/python3 這個路徑是怎麼找到的呢?

一般來說,軟體的二進位制檔案都可以在 /usr/bin 或 /usr/local/bin (這個優先順序高一點)找到。當然如果你是Debian系的Linux,可以這麼找(前提是你已經安裝了Python3):

$ dpkg -L python3

上面的別名修改只是暫時性的,重開一個視窗後配置就不見了。如果要使每個視窗都使用這個別名,可以編輯 ~/.bashrc

 (如果你是別的shell的話,就不是這個檔案,如zsh是 ~/.zshrc ),把alias配置寫入檔案。

修改別名優點是足夠簡單,但是切換不靈活。

0x02 連結檔案

在 /usr/bin 中建立一個連結檔案指向Python3。

$ ln -s python /usr/bin/python3
$ python --version
Python 3.4.3

跟修改別名一樣,也是修改不夠靈活。

0x03 採用update-alternatives 切換版本

update-alternatives是Debian提供的一個工具(非Debian系的就不用看了),原理類似於上面一個辦法,也是通過連結的方式,但是其切換的過程非常方便。

首先看一下update-alternatives的幫助資訊:

$ update-alternatives --help
用法:update-alternatives [<選項> ...] <命令>

命令:
  --install <連結> <名稱> <路徑> <優先順序>
    [--slave <連結> <名稱> <路徑>] ...
                           在系統中加入一組候選項。
  --remove <名稱> <路徑><名稱> 替換組中去除 <路徑> 項。
  --remove-all <名稱>      從替換系統中刪除 <名稱> 替換組。
  --auto <名稱><名稱> 的主連結切換到自動模式。
  --display <名稱>         顯示關於 <名稱> 替換組的資訊。
  --query <名稱>           機器可讀版的 --display <名稱>.
  --list <名稱>            列出 <名稱> 替換組中所有的可用候選項。
  --get-selections         列出主要候選項名稱以及它們的狀態。
  --set-selections         從標準輸入中讀入候選項的狀態。
  --config <名稱>          列出 <名稱> 替換組中的可選項,並就使用其中
                           哪一個,徵詢使用者的意見。
  --set <名稱> <路徑><路徑> 設定為 <名稱> 的候選項。
  --all                    對所有可選項一一呼叫 --config 命令。

<連結> 是指向 /etc/alternatives/<名稱> 的符號連結。
    (如 /usr/bin/pager)
<名稱> 是該連結替換組的主控名。
    (如 pager)
<路徑> 是候選專案標檔案的位置。
    (如 /usr/bin/less)
<優先順序> 是一個整數,在自動模式下,這個數字越高的選項,其優先順序也就越高。

選項:
  --altdir <目錄>          改變候選項目錄。
  --admindir <目錄>        設定 statoverride 檔案的目錄。
  --log <檔案>             改變日誌檔案。
  --force                  就算沒有通過自檢,也強制執行操作。
  --skip-auto              在自動模式中跳過設定正確候選項的提示
                           (只與 --config 有關)
  --verbose                啟用詳細輸出。
  --quiet                  安靜模式,輸出儘可能少的資訊。不顯示輸出資訊。
  --help                   顯示本幫助資訊。
  --version                顯示版本資訊。

我們僅需要了解3個引數就行了

  • --install <連結> <名稱> <路徑> <優先順序> :建立一組候選項
  • --config <名稱> :配置 <名稱>組中的可選項,並選擇使用其中哪一個
  • --remove <名稱> <路徑> :從 <名稱> 中去掉 <路徑>選項

首先我們先看一下有沒有關於Python的可選項:

$ update-alternatives --display python
update-alternatives: 錯誤: 無 python 的候選項

那首先先建立python的組,並新增Python2和Python3的可選項

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2 # 新增Python2可選項,優先順序為2
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 1 #新增Python3可選項,優先順序為1

注意,這裡的 /usr/bin/python 連結檔案,兩個可選項必須是一樣的,這樣這個連結檔案才可以選擇兩個不同的可選項去連結。

這時如果我們檢視 /usr/bin/python 這個檔案時,會發現它已經連結到了 /etc/alternatives/python 。

lrwxrwxrwx 1 root root        24  619 18:39 python -> /etc/alternatives/python

然後我們再看一下版本

$ python --version
Python 2.7.6

為什麼還是Python2,看一下配置

$ sudo update-alternatives --config python2 個候選項可用於替換 python (提供 /usr/bin/python)。

  選擇       路徑              優先順序  狀態
------------------------------------------------------------
* 0            /usr/bin/python2.7   2         自動模式
  1            /usr/bin/python2.7   2         手動模式
  2            /usr/bin/python3.4   1         手動模式
要維持當前值[*]請按回車鍵,或者鍵入選擇的編號:

原來是因為預設選中了自動模式,而Python2的優先順序高於Python3,這時候只要鍵入2,就可以使用Python3了。

如果你想要刪除某個可選項的話:

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

update-alternatives只適用於Debian系Liunx。

0x04 virtualenvwrapper 切換版本

virtualenvwrapper是管理Python虛擬環境的工具,可以很方便的為不同的專案建立獨立的環境,每個專案都可以安裝自己的依賴,同時也支援在不同的虛擬環境中存在不同版本的Python。

首先安裝virtualenvwrapper,可以選擇apt安裝或者pip安裝

apt安裝

$ sudo apt-get install virtualenvwrapper

pip安裝

$ sudo pip install virtualenvwrapper

當你需要使用Python2開發專案時,建立一個Python2的虛擬環境:

$ mkvirtualenv -p /usr/bin/python2 env27

當你需要Python3開發時:

$ mkvirtualenv -p /usr/bin/python3.4 env34

然後可以隨時切換不同的虛擬環境:

$ workon env27  # 進入Python2環境
$ workon env34  # 進入Python3環境

更爽的是,你可以在進入虛擬環境的同時切換到專案目錄,只需要編輯 $VIRTUAL_ENV/bin/postactivate 這個檔案即可:

$ vim $VIRTUAL_ENV/bin/postactivate  #前提是已經進入對應的虛擬環境

在檔案中新增切換目錄的命令:

cd  /path/to/your/project

0x05 總結

前面兩種方法不推薦使用。

使用 update-alternatives 切換版本只適用於Debian系的Linux。

推薦使用 virtualenvwrapper 來管理虛擬環境和版本。

另外,本文介紹的切換不同版本軟體的方法,除了 virtualenvwrapper 之外,前面3種方法都適用於其他軟體,比如Java(open-jdk和oracle-jdk)。