1. 程式人生 > 其它 >Python版本管理神器-pyenv

Python版本管理神器-pyenv

技術標籤:sparkPython

一、問題情景:

  1. Python直譯器版本混亂, 2和3差別巨大, 而且細分版本也不盡相同, 難以選擇和管理.
  2. 不同Linux發行版自帶Python不同, 如ubuntu16自帶2.7和3.5版本, 其中系統許多元件依賴於自帶直譯器, 一旦刪除或者更改都可能會造成系統出問題.
  3. 不同的Python直譯器軟體包管理也是問題, 如pip和ipython等必備包元件, 而且在專案開發中如何保證不同的包環境互不干擾也是一個問題.

那麼有沒有一個終極的解決辦法能在管理不同直譯器版本的同時控制不同的包環境呢? 有的, 就是pyenv.

二、pyenv是什麼? 能幹什麼?

pyenv是一個forked自ruby社群的簡單、低調、遵循UNIX哲學的Python環境管理工具, 它可以輕鬆切換全域性直譯器版本, 同時結合vitualenv外掛可以方便的管理對應的包源.

我們知道, 在terminal中輸入一個命令比如‘ls’時, shell會從當前環境的PATH中的各個目錄裡看是不是有ls這個可執行檔案, 如果找到就執行, 否則就會報‘command no found’ 的錯誤, 同理, 只要控制PATH變數就能夠做到python版本的切換, pyenv通過在PATH頭部插入shims路徑來實現對python版本的控制.

pyenv和流行的pipenv、virtualenv的關係

pipenv是requests 作者 Kenneth Reitz大神寫的一個python虛擬環境管理工具, 結合了pip和virtualenv的功能, 側重點還是在包環境管理上, 使用思路是先建立一個指定python版本的環境, 然後在此環境上安裝相應的包, 好評不錯, 看到很多大牛都在推薦.

virtualenv是一個比較傳統成熟的虛擬環境管理工具了, 用的人也比較多, 思路也是建立虛擬環境, 然後安裝相應的包, 要進入環境就source一下activate指令碼啟用一下, 儘管成熟, 但是我個人不太喜歡用, 在部署專案的時候老是容易出現一些環境問題.

pyenv相對來說知名度就差很多了, 不過也很穩定, 這三個環境管理工具我都用過, 我個人更喜歡pyenv, 理由如下:

  • 相對於其他兩個工具, pyenv更側重在python 直譯器版本管理上, 比包管理更大一個層級, 使用pyenv我可以方便的下載指定版本的python直譯器, pypy, anaconda等, 可以隨時自由的在shell環境中本地、全域性切換python直譯器
  • 開發的時候不需要限定某個版本的虛擬環境, 只需要在部署的時候用pyenv指定某個版本就好了
  • pyenv切換直譯器版本的時候, pip和ipython以及對應的包環境都是一起切換的, 所以如果你要同時執行ipython2.x和ipython3.x多個直譯器驗證一些程式碼時就很方便
  • pyenv也可以建立好指定的虛擬環境, 但不需要指定具體目錄, 自由度更高, 使用也簡單

三、安裝pyenv

  1. 在家目錄裡clone專案:
 $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

# MacOS的話可以直接用homebrew安裝
$ brew update
$ brew install pyenv 

2. 新增shell配置檔案中追加如下: (如zshrc)

export PYENV_ROOR="$HOME/.pyenv"
export PATH=$PYENV_ROOT/shims:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

3. source一下配置檔案, 輸入pyenv --version測試一下

四、簡單使用

# 檢視當前版本
pyenv version

# 檢視所有版本
pyenv versions

# 檢視所有可安裝的版本
pyenv install --list

# 安裝指定版本
pyenv install 3.6.5
# 安裝新版本後rehash一下
pyenv rehash

# 刪除指定版本
pyenv uninstall 3.5.2

# 指定全域性版本
pyenv global 3.6.5

# 指定多個全域性版本, 3版本優先
pyenv global 3.6.5 2.7.14

# 實際上當你切換版本後, 相應的pip和包倉庫都是會自動切換過去的

五、包管理外掛pyenv-virtualenv

首先下載:

$ git clone https://github.com/pyenv/pyenv-virtualenv.git $.pyenv/plugins/pyenv-virtualenv

克隆完成後新增如下到shell配置檔案(mac的話是.zshrc)

$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

實際上mac使用者直接brew安裝就可以了...

$ brew install pyenv-virtualenv
$ eval "$(pyenv init -)"
$ eval "$(pyenv virtualenv-init -)"

使用:

# 建立一個3.6.5版本的虛擬環境, 命名為v365env, 然後啟用虛擬環境
$ pyenv virtualenv 3.6.5 v365env
$ pyenv activate v365env
# 關閉虛擬環境
$ pyenv deactivate v365env

當切換python直譯器的時候對應的pip和包庫也會一併切換過去, 而且可以為指定版本的直譯器建立專案所需的虛擬環境, 切換的時候也異常簡單, 個人常用的做法是為每個專案建立不同的虛擬環境, 當進入該環境的時候就可以隨便浪而不用擔心影響到其它專案, 搭配Pycharm使用效果更佳.

六、瞭解更多使用姿勢

pyenv專案地址:

pyenv/pyenv​github.com

pyenv-vitualenv外掛地址:

pyenv/pyenv-virtualenv​github.com