008_使用pyenv進行py開發環境管理
一、
安裝Python
絕大多數Python入門書籍,都會介紹如何安裝Python,然而,本書要介紹一種全新的安裝方式。使用pyenv來安裝並管理我們的環境。
pyenv簡介
由於Python的依賴是基於site的,這多與生產環境來說,是一種簡單而正確的方式,然後,對於我們的開發環境,基於這樣的管理方式,帶來了可怕的第三方依賴管理的難題。想象一下,你在開發一個新項目的同時,還在維護一個就項目, 新項目依賴某個包的較新的版本,舊項目卻依賴一個相對較舊的版本,而這兩個版本是不兼容的,事實上,這種不兼容,在Python世界裏是司空見慣的。
基於以上難題,virtualenv適時出現了,拯救了廣大因依賴問題焦頭爛額的Python程序員。virtualenv無疑是成功的,他為每個項目創建一個虛擬環境,使得項目的依賴全部在一個虛擬且封閉的環境中,互不幹擾。然而,這就夠了嗎?
想象下面一種場景:你的新項目在Python 3.3下面開發,而你維護的舊項目,缺工作在Python 2.7之上,為了完成工作,你不得不安裝兩個Python解釋器,並為每個解釋器配置virtualenv,在你調試執行的時候,不得不適用冗長的全路徑調用解釋器,或者不斷的修改你的環境變量。天哪,你再次陷入與你的工作無關的,煩人的事情中。
pyenv的出現,就是來拯救你的。pyenv是一個Python多版本管理工具,他設計精巧,通過巧妙的方法,可以使多版本的Python共存在一個操作系統能,簡單的實現切換,或者更具項目使用不同的Python。
pyenv支持插件,通過插件,可以和virtualenv完美結合,實現多版本,多環境的控制,是你的每個項目,仿佛運行在一個完全隔離的環境種一樣。
安裝pyenv
pyenv是純python開發的,安裝pyenv只需要極少數的依賴,它們是::
- Python >= 2.5 < 3
- git
因為pyenv是Python開發的,所以需要有一個可運行的python版本,然而,這個不必擔憂,絕大多數linux和unix發行版以及mac都已經預裝了python,我們唯一需要做的是安裝git,並且把他的路徑放到PATH
中。
如果你能訪問Github, 那麽安裝pyenv是一件簡單而快樂的事, 因為pyenv的作者,很貼心的給我們準備了一個安裝腳本pyenv-installer,只需要簡單的執行就可以了。
使用pyenv-installer安裝pyenv很簡單,只需要在終端執行:
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
等待一段時間就可以了。安裝完成,pyenv-installer會提示你配置pyenv的環境變量,你僅僅需要做的就是根據提示,把如下的內容加入到你的profile裏。
export PYENV_ROOT="\${HOME}/.pyenv"
if [ -d "\${PYENV_ROOT}" ]; then
export PATH="\${PYENV_ROOT}/bin:\${PATH}"
eval "\$(pyenv init -)"
fi
重新載入profile之後,你就可以開始使用你的pyenv了,使用pyenv-installer安裝的pyenv,會幫助我們安裝幾個有用的插件,其中,最常用的有:
- pyenv-virtualenv 用於整合virtualenv
- pyenv-pip-rehash 用於使用pip安裝包之後自動執行rehash
- pyenv-update 用於升級pyenv
使用pyenv安裝Python
使用pyenv安裝Python非常簡單,但是在由於需要編譯Python,所以我們需要有變異Python的依賴,以CentOS 6為例,我們需要如下依賴:
- gcc
- gcc-c++
- make
- patch
- openssl-devel
- zlib-devel
- readline-devel
- sqlite-devel
- bzip2-devel
你可以使用你喜歡的包管理器來安裝這些依賴,例如:
yum -y install gcc gcc-c++ make patch openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel
完成以上步驟之後,你可以使用pyenv來管理你的Python環境了。安裝Python只需要使用install
命令即可。
pyenv install 2.7.5
以上命令將在你的系統上安裝 Python-2.7.5, 使用過linux包管理系統的朋友,對這樣的安裝方式,是相當親卻的。
install
命令有若幹選項可用,可以通過 pyenv help install
來查看。常用的,我們可以通過-l
選項來查看所有可用版本:
pyenv install -l
講列出所有可用版本。
tips:由於使用pyenv安裝的時候,需要到github下載Python源碼包,國內用戶可能速度比較慢,這個時候,可以修改PYTHON_BUILD_MIRROR_URL
環境變量,使用國內鏡像。http://magedu-python.qiniudn.com/pythons
是我制作的一個鏡像,托管在七牛雲存儲上
安裝完成之後,並不能立刻使用你所安裝的Python,因為pyenv作為一個Python環境管理工具,安裝只是第一步,你還需要切換到你新的Python版本上。pyenv提供兩個命令來切換Python版本。global
命令和local
命令。故名思議,一個是全局的,一個是本地的。
在介紹兩個切換命令之前,我們先來看其他幾個pyenv命令。
versions和version命令
versions
命令列出你已經安裝的Python版本以及當前使用的版本
pyenv versions
執行以上輸出,你將會得到如下的輸出:
也許你的輸出會有所出入,但是大致相同,前面加*
號的版本是當前版本,後面括號內的內容描述了它是在何處設置的,後面會詳細講解。
version
命令打印你當前使用版本。version
命令的輸出類似versions
命令,但是它只包含了當前版本那一行,並且沒有前導的*
.
版本名稱system
代表系統預裝Python。
global和local命令
global
命令和local
命令都是用來切換當前Python版本的命令。不同之處在於,global
的切換是全局的,而local
的切換是局部的。
pyenv local 2.7.5
以上命令:會在當前目錄下創建一個.pyenv-version
文件,文件內容為2.7.5
,pyenv通過這種形式,標記當前目錄使用Python-2.7.5。如果其子目錄下面沒有.pyenv-version
文件,那麽此版本講繼承到子目錄。
pyenv global 2.7.5
以上命令:會修改$PYENV_HOME/version
文件的內容,標記全局Python版本,如何理解全局Python版本,可以認為全局版本是一個默認值,當一個目錄及其父目錄下面都沒有.python-version
文件的時候,會使用全局版本。
一般的,我們不修改全局版本,而使用期默認值system
,因為在unix系統上,很多系統工具依賴於Python,如果我們修改了Python的版本,會造成絕大多數的依賴Python的系統工具無法使用,如果你不小心修改了,也不要緊張,使用global
命令修改回來就可以了,有時候,你發現部分系統工具無法使用,你也可以看看你當前的Python版本。
到這裏,你或許已經迫不及待的想要開始了,那麽你可以跳過本章之後的部分,直接看第二章,開始你的Python之旅,但是我還是強烈建議你以後回過頭來看看本章剩下的部分,他演示了如何使用pyenv結合virtualenv的強大功能。
uninstall 命令
顧名思義,uninstall命令是用來卸載Python版本的,一個已經安裝的版本,如果我們不在使用,可以簡單的執行uninstall
命令把它從硬盤上卸載。
pyenv uninstall 2.7.5
以上命令將卸載Python-2.7.5
pyenv與virtualenv
pyenv通過插件,可以很好的和virtualenv一起工作,通過整合virtualenv,pyenv實現了真正意義上的環境隔離,每個項目都相當於使用一個單獨的解釋器。
通過pyenv-installer安裝的pyenv,已經安裝好virtualenv插件了,如果不是通過pyenv-installer安裝的pyenv,你可能需要自己安裝virtualenv插件,安裝方法也很簡單:
cd $PYENV_ROOT/plugins
git clone https://github.com/yyuu/pyenv-virtualenv.git
直接把插件clone下來就安裝完成了。
安裝完成之後,我們可以通過virtualenv命令即可創建虛擬環境,virtualenv的一般用法如下:
pyenv virtualenv [-f|--force] [-u|--upgrade] [VIRTUALENV_OPTIONS] <version> <virtualenv-name>
選項-f
表示強制的,也就是如果已經存在這個虛擬環境,那麽將會覆蓋這個虛擬環境 選項-u
表示upgrade,用於修改已經存在的虛擬環境的Python版本 VIRTUALENV_OPTIONS
是傳遞給virtualenv的選項,可以通過virtualenv的幫助獲取選項的含義version
表示Python版本 virtualenv-name
是我們給虛擬環境指定的名字
例如:
pyenv virtualenv 2.7.5 my_project
以上命令就創建了一個基於Python-2.7.5,名為my_project的虛擬環境。創建好的虛擬環境猶如一個單獨Python版本一樣,我們可以通過local
或者global
命令切換過去。
由於每個解釋器間是完全隔離的,所以強烈建議你的每個項目,都放置在單獨的虛擬環境中。
virtualenv插件還提供了virtualenvs
命令,用於列出所有已經創建的虛擬環境,
pyenv virtualenvs
以上命令列出我們所有已經創建的虛擬環境,已經虛擬環境基於那個Python版本。
當我們的一個項目生命周期結束的時候,我們或許會想要刪除虛擬環境以釋放我們的硬盤空間,刪除虛擬環境非常簡單,直接用uninstall
命令像刪除正常的Python版本一樣就可以了。
事實上,虛擬環境一旦創建,你就可以把他當成一個獨立的版本來使用和維護了。
二、使用
pyenv virtualenv 2.7.10 jyallprodpy
參考:https://github.com/comynli/pybooklet/blob/master/install.md
008_使用pyenv進行py開發環境管理