天天看點

pyenv快速入門

在開發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環境變量

當執行指令的時候,系統會在環境變量中從左到右依次尋找比對的指令并執行。環境變量中是一組以冒号

:

分隔的路徑。

pyenv快速入門

環境變量

墊片(Shims)

pyenv的工作原理其實很簡單,将它自己管理的Python目錄插到環境變量的最前面,這樣一來系統在搜尋Python的時候第一個找到的就是pyenv管理的Python環境。這個插到最前面的路徑就叫做墊片(shims),當然這是在英文語境下,在中文環境下我老覺得怪怪的,反正了解意思就好。

選擇Python版本

當執行pyenv指令的時候,它會按照以下順序來決定要使用的Python版本:

  1. 使用

    PYENV_VERSION

    環境變量(如果存在). 你可以使用

    pyenv shell

    指令來在目前shell環境中設定該環境變量.
  2. 目前目錄中應用程式指定的

    .python-version

    檔案(如果存在). 你可以用

    pyenv local

    指令來修改目前目錄的

    .python-version

    檔案.
  3. 自底向上搜尋各層上級目錄,找到的第一個

    .python-version

    , 直到到達檔案系統根目錄.
  4. 全局的

    $(pyenv root)/version

    檔案. 可以使用

    pyenv global

    指令來修改. 如果全局版本檔案不存在, pyenv假設你使用系統安裝的Python. (換句話說就是未安裝pyenv時環境變量中找到的Python.)

常用指令

完整指令請參考

官方文檔

列出所有可安裝的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