【virtualenv】python
用Python開發時面臨的一個大問題就是每一個項目須要的依賴包不一致。若是是包自己不同倒還好,若是不一樣項目須要的是不一樣版本的包的話就會很麻煩。若是採用統一的系統Python環境(這裏先定義一下系統python環境,是指好比windows上安裝Python的目錄默認是C:\python27之類的目錄下面的全部python相關內容,而linux由於自帶python,就是指系統自帶的那套python環境。好比第三方庫都存儲在/usr/lib/python2.7/site-packages下等等)開發,包也只有一套作不到按項目區分。linux
解決這個問題的辦法就是採用虛擬環境進行開發和維護不一樣的項目。所謂虛擬環境,其實就是說在系統Python環境以外另搭一套python環境,這套python環境可能借用一部分系統Python環境的內容,而自身補充另外一些。身處虛擬環境上下文中的程序將會按照虛擬環境給出的邊界來運行。flask
創建和管理虛擬環境的簡單工具就是virtualenv了。virtualenv在linux平臺和windows平臺上均可用,並且它會根據本身所在的具體平臺來改變一些配置適應當前OS。bootstrap
安裝virtualenv十分方便,只要pip install virtualenv便可。這代表virtualenv其實也是用python寫成的一個包。但更加方便的地方在於,在pip安裝過程當中會爲咱們在系統的可執行文件目錄下(linux的話就是/usr/bin下)爲咱們設立一個virtualenv的可執行文件。也就是說在命令行直接鍵入virtualenv就能夠了。下面將以linux(CentOS7)爲基礎,說明virtualenv的用法。windows
■ 基本使用app
在命令行鍵入virtualenv <虛擬環境目錄名>就能夠在當前位置生成一個虛擬環境的目錄,虛擬環境的目錄名也就是虛擬環境的名字。打開這個目錄咱們能夠看到主要有bin,include,lib等目錄,其中重點關注一下bin和lib兩個目錄。bin目錄下顧名思義放着一些可執行的二進制文件,進去以後能夠看到除了python以及幾個不一樣名字的python軟鏈以外, 還有pip和easy_install這倆。就知道了,虛擬環境生成時自帶了pip和easy_install這兩個重要的工具,方便後續環境的搭建。lib目錄能夠看到最下面有個site-packages目錄的。這個目錄固然就是一些第三方庫的目錄了,默認狀況下生成的這個目錄中是隻帶有一些基本的第三方包的。傳說加上--system-site-packages做爲參數能夠把系統python環境中的第三方包完整地拷貝過來,可是試了一下並不行。(剛纔試了一下,--no-site-packages和--system-site-packages的主要區別是在虛擬環境架設完畢後進行pip安裝時,若是原本系統環境中存在了想要裝的包,指定--no-site-packages的會把那個包複製到虛擬環境的lib中,後者則不會。但這也不絕對。。好比我想pip install flask flask-bootstrap的時候,裝flask包時確實能體現這個區別,可是裝flask-bootstrap的時候,不管用啥參數flask-bootstrap文件就是不被複制過來。。)python2.7
另外在目錄下還能夠看到一個activate文件。這個文件是進入虛擬環境的入口。鍵入source activate就能夠看到命令行的提示符前面多出了一個小括號,括號中是虛擬環境的名字。進入虛擬環境以後,鍵入pip,python等命令時運行的就再也不是系統python環境中的那些命令了。用which python就能夠看一下,顯示的應該已經不是/usr/bin/python了。所以,在這個環境中(不管你在哪一個目錄下),只要調用了python命令來運行腳本的話,那麼它所用的第三方庫等上下文就是虛擬環境的上下文了。因此在虛擬環境的lib目錄下安裝想要的第三方包,而後用這個虛擬環境的python啓動程序,就可使這個程序或者項目處於一個相對獨立封閉的環境中了。工具
說到安裝,虛擬環境中自帶了pip,也就是提示咱們能夠用pip安裝。並且pip安裝方便的一點在於,若是你要安裝的包已經存在於系統python環境中了,那麼pip不會再去PyPI上面下載,而是直接從系統環境中複製過來就好,因此安裝速度也大大提升。另外,用pip freeze > requirement.txt這個命令能夠將虛擬環境上下文中的python包的要求和依賴固化到requirement.txt這個文件中。當程序進行遷移但環境沒有遷移的時候,只要在新環境中鍵入pip install -r requirement.txt來一口氣安裝全部這些依賴便可。將虛擬環境和pip freeze兩個東西結合起來用十分方便ui
■ 關於程序遷移的問題spa
項目開發過程當中,經常遇到的就是在開發環境開發完成以後上線生產環境,可是生產環境的python環境不必定和開發環境一致,引發不少麻煩。
此時用虛擬環境能夠節省力氣。好比生產環境上面裝了virtualenv,那麼就能夠在合適的地方創建一個虛擬環境,而後activate進入這個虛擬環境以後根據開發環境中固化下來的requirement.txt在虛擬環境中pip install -r requirement.txt。一口氣就能夠把全部依賴包都裝進去。而後進入虛擬環境,用虛擬環境python啓動程序(或者直接經過路徑調用虛擬環境目錄下的bin/python來啓動)就能夠作到和開發環境同樣了。
不過能這麼作仍是比較好的狀況,假如生產環境沒網呢?這時得想另外辦法。在有網的地方搭建一套虛擬環境而後pip install相關包而後再把那些文件複製過來不失爲一個好辦法,不過略顯麻煩。另外一個辦法是這樣的:直接把開發環境的整個虛擬環境複製到生產環境上,若是複製過去以後的路徑相比於開發環境有變化,那麼能夠改動一下activate中VIRTUAL_ENV這個即將被添加的環境變量爲新目錄,這樣就能夠保證source activate出來的虛擬環境仍然是保持虛擬環境而不是變成了系統環境。(其實看下activate的代碼不難發現,所謂虛擬環境只是在source activate的時候增長了一點環境變量,包括把虛擬環境下bin目錄添加到PATH中而且先於原先全部PATH,因此在鍵入python的時候調用的是虛擬環境的python了,其他一些環境變量也相似。deactivate就是把這些環境變量恢復原值。)而後在項目中添加一個啓動腳本,這個腳本先進入虛擬環境而後調用python啓動程序,一切就和開發環境同樣了。
請注意:上面的遷移要成功有一個大前提,就是生產環境和開發環境的python版本要同樣。。。若是在python2.7下開發,遷移到2.6上極可能就會報缺乏libpython2.7.so.1.0之類的錯誤。若是真的想要一站式解決這個問題,好比想把這個程序移植到沒有python的環境中去,那麼須要把整個python都安裝過去。
■ windows下的virtualenv
windows下的virtualenv生成的虛擬環境的目錄和linux下不太同樣。主要區別在於bin目錄被更名成Scripts目錄且裏面都是一些.exe文件包括activate。而後lib改叫Lib了。其餘的好像倒也都相似
■ virtualenvwrapper
有空再補充吧。。