在開發Python程式的時候,有時候可能需要在不同版本的Python上進行測試。pyenv就是這麼一個管理多版本Python的工具。由于在Windows中我們可以同時安裝多個版本的Python,是以這裡是在Linux下介紹該工具。
安裝
首先當然是安裝pyenv了,最簡單的辦法就是利用官方Github倉庫中的安裝腳本了:
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
安裝腳本有可能會提示你手動把幾行指令添加到shell的配置檔案中。
如果你用的是zsh的話,别忘了替換指令中的bash。将來如果要删除的話,需要在
.zshrc
檔案中删除。如果你用oh-my-zsh的話,不需要在
.zshrc
中添加那幾行(加了也沒用),而是在
.zshrc
中啟用pyenv插件。
将來要進行更新的話:
$ pyenv update
要解除安裝pyenv的話更加簡單,直接删除目錄即可:
$ rm -fr ~/.pyenv
别忘了把
.bashrc
中的這幾行也一并删掉:
export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
工作原理
Linux環境變量
當執行指令的時候,系統會在環境變量中從左到右依次尋找比對的指令并執行。環境變量中是一組以冒号
:
分隔的路徑。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIWNhRzN5EWNyYTOkRmZmRmYxEzNiJWM4Y2M0YGNxYjNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
環境變量
墊片(Shims)
pyenv的工作原理其實很簡單,将它自己管理的Python目錄插到環境變量的最前面,這樣一來系統在搜尋Python的時候第一個找到的就是pyenv管理的Python環境。這個插到最前面的路徑就叫做墊片(shims),當然這是在英文語境下,在中文環境下我老覺得怪怪的,反正了解意思就好。
選擇Python版本
當執行pyenv指令的時候,它會按照以下順序來決定要使用的Python版本:
- 使用
環境變量(如果存在). 你可以使用PYENV_VERSION
指令來在目前shell環境中設定該環境變量.pyenv shell
- 目前目錄中應用程式指定的
檔案(如果存在). 你可以用.python-version
指令來修改目前目錄的pyenv local
檔案..python-version
- 自底向上搜尋各層上級目錄,找到的第一個
, 直到到達檔案系統根目錄..python-version
- 全局的
檔案. 可以使用$(pyenv root)/version
指令來修改. 如果全局版本檔案不存在, pyenv假設你使用系統安裝的Python. (換句話說就是未安裝pyenv時環境變量中找到的Python.)pyenv global
常用指令
完整指令請參考
官方文檔。
列出所有可安裝的Python版本:
pyenv install -l|--list
安裝某個Python:
pyenv install <version>
解除安裝
解除安裝某個Python,
-f
參數指定是否強制解除安裝,如果強制解除安裝的話不會彈出提示,而且如果版本不存在的話也不會顯示錯誤資訊:
pyenv uninstall [-f|--force] <version>
versions
列出所有已安裝的Python,目前使用的Python會用星号标出:
$ pyenv versions
2.5.6
2.6.8
* 2.7.6 (set by /home/yyuu/.pyenv/version)
3.3.3
jython-2.5.3
pypy-2.2.1
global
通過寫
~/.pyenv/version
檔案的方式設定全局Python:
$ pyenv global 2.7.6
local
通過在目前目錄寫
.python-version
檔案的方式設定目前目錄下的Python:
pyenv local 2.7.6
當不再需要本地Python的時候,用
--set
來清除:
$ pyenv local --unset
shell
指定目前shell使用的Python:
$ pyenv shell pypy-2.2.1
當不再需要的時候,用
--set
$ pyenv shell --unset
最後展示一下
pyenv install -l
的輸出,可以看到,pyenv可以友善的安裝大部分版本的Python,省略号表示中間有一大堆:
yitian@ubuntu:~ $ pyenv install -l
Available versions:
2.1.3
...
2.7.15
...
3.6.6
3.7.0
3.7-dev
3.8-dev
activepython-2.7.14
activepython-3.5.4
activepython-3.6.0
anaconda-1.4.0
...
anaconda3-5.2.0
ironpython-dev
ironpython-2.7.4
ironpython-2.7.5
ironpython-2.7.6.3
ironpython-2.7.7
jython-dev
jython-2.5.0
jython-2.5-dev
jython-2.5.1
jython-2.5.2
jython-2.5.3
jython-2.5.4-rc1
jython-2.7.0
jython-2.7.1
micropython-dev
micropython-1.9.3
micropython-1.9.4
miniconda-latest
miniconda-2.2.2
...
miniconda3-4.3.30
pypy-c-jit-latest
pypy-c-nojit-latest
pypy-dev
pypy-stm-2.3
pypy-stm-2.5.1
pypy-1.5-src
pypy-1.5
...
pypy3.5-6.0.0
pyston-0.5.1
pyston-0.6.0
pyston-0.6.1
stackless-dev
stackless-2.7-dev
stackless-2.7.2
...
stackless-3.5.4
常見問題
用pyenv安裝Python的時候可能會出現各種各樣問題,例如缺少zlib、缺少ctypes子產品等等。對此pyenv也有專門一個
頁面解決。對于我的Ubuntu 18.04虛拟機來說,安裝以下一坨軟體可以解決問題:
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev libedit-dev
其他系統請檢視pyenv的頁面,如果有其它問題請自行搜尋
Stack Overflow