2014-06-20

[pre-survey]virtualenv, pythonbrew 和 pyenv有什麼不同, 該選哪一個?


緣起
因為 Python2 及 python3 有著重大的改變, python2.7 跟 python3 是個分水嶺, 很多lib架構, 用法已改變, 故困擾很多 python 使用者. 現在的 os 通常還是用 2.x python, 若你將它移除, 那麼杯具就會發生.
所以如果有工具可以完美解決 python2 , 3 切換問題, 讓我們想用2時就用2, 想用3時就用3是不是就很完美呢?



是的, 基本上有三個工具: virtualenv, pythonbrew 和 pyenv
那麼 virtualenv, pythonbrew 和 pyenv有什麼不同, 該選哪一個?

pythonbrew 杯具了
首先 pythonbrew不再維護了, 即使在維護時它也不支援windows, 所以可以看出作者們很忙. 這就是OSP(Open Source Project)的宿命, 常常會有胎死腹中的可能. 這也是 linux 工程師的宿命, 無名劍來自於無, 多年後又消失於無, 就這樣浪費了一生的時間.... 杯具.


不過, 因為 pythonbrew 的不再維護, 所以問題就變簡單了, 我們只要二選一. 從 virtualenv 及 pyenv 兩者中選擇一個即可.

virtualenv and pyenv, which one is better?
那麼 virtualenv 跟 pyenv 有什麼不同, 我該選哪一個?

virtualenv
不廢話, virtualenv 運作如下

它的運作原理是這樣的, 首先你的 os 必需先安裝不同的 python. 那麼它如何幫你切換呢? 其實它是從你現在系統內安裝的 python 中, 將你指定的 python 版本及相關 lib, site-packages 拷貝到你指令的目錄下, 以目錄為工具, 來隔離各版本 python













例如下列指令就可以讓你將你作業系統內己安裝的 python2.7 及 python3.2 分別拷貝到 .env2.7 及 .env3.2 目錄下
#virtualenv .env2.7 --python=python2.7
#virtualenv .env3.2 --python=python3.2

此後, 你要用 python2.7 就進 .env2.7 目錄, 然後activate 它. activate後所有的 easy_install, pip...等動作均會在 .env2.7目錄下動作, 它不會影響到你原系統的 python. 同理要用 python3.2 也是一樣, 切到 .env3.2 然後 activate 它即可達到切換要求.


pyenv
那麼 pyenv 又是怎麼運作的呢?
註: pyenv 跟 pythonbrew基本上是同樣的工具, 可以作為取代工具.










下載到versions目錄下維護




pyenv 的作法跟 virtualenv 很像, 但從一開始的 initial 就不同了. 它的 python 來源不是你本地端己安裝的 python. 而是雲端上的 python, jpython, pypy...
你可以選擇你要的 python 版本安裝, 然後它就會 co 到你的 ".pyenv/versions/" 目錄下.
你可以透過指令
#pyenv global [你要切換的python版本]
來切換你現在 python 的環境.
當你打 python 或 pip 指令時, 它透過嵌入模組shims得知你要用 python, 然後背景餵給你versions下你現在切換的 python, 讓你無感切換/使用 python. 詳細請看這裡 How it works


virtualenv與pyenv的不同
所以這兩者有什麼不同? 我應該用哪一個?

[原理]
*virtualenv:  讓你進特定目錄, 進虛擬環境下運作
*pyenv: 用 shims 讓你能夠全域切換 python 版本, 而不需進去虛擬 shell. 讓你可以在原目錄原環境下但可以達到切換的目的

[優點]
*virtualenv: 你可以無限create目錄, 即使python版本一樣. 例如你可以create 好幾個 python2.7, 為什麼要這樣做? 因為你有可能會很多專案都使用 python2.7, 但 site-packages 卻不一樣

*pyenv: pyenv 的 python 都是從雲端下載, 即時安裝, 故不需要先在本地安裝成功, 安裝 python 容易. 然後它的虛擬切換可以讓你感覺不到它的存在, 並且它的影響是全域的不必進入虛擬 shell.

[缺點]
*virtualenv: 切換時必需進特定目錄啟用(也不是一定要進啦, 就是要activate特定python目錄下的python). 但pyenv則是 list 然後直接指定版本, 直覺很多.
*pyenv: 不能同一版本多次安裝, 在多個使用相同python的專案裡, 不能分別安裝專案只需要的site-packages. 安裝 pyenv 需要 compile.

[其它]
在 pyenv 下, 你依然可以安裝你的 virtualenv, 並使用它. pyenv-virtualenv


結論
所以 virtualenv 跟 pyenv 不是互斥的, 反倒是可以互補,
若你接受安裝多 python在原本os裡, 並且不排斥虛擬提示符號, 並且能解決與 apache 的嵌入問題, 那麼你可以選 virtualenv

pyenv 的切換是全域的, 若你不care site-packages 問題, 又希望不要感覺到切換python的存在, 則你可以選 pyenv.

但我的選擇是用 pyenv 安裝系統, 再配合 virtualenv 來達到我同python多site-packages的要求. 缺點是 pyenv 要 compile, 你要小小準備一下 library. 若你用的是 ipkg, 那麼就是一大挑戰了, 但這些人是少數.


安裝
安裝問題很簡單, 網路上找就有一堆, 故省





沒有留言:

張貼留言