安裝 virtualenv
virtualenv是將Python的實際運行環境進行虛擬的工具包。
使用pip install命令安裝的功能包,均會存放在/usr/local/lib/python2.7目錄下。一旦安裝了各種各樣的功能包,當我們想讓不同的Python應用程序在同一個環境開發時,就會發現自己根本分不清哪個包對應哪個應用程序。virtualenv就是在這樣的情況下,對多種不同的Python運行環境進行管理的一個工具。
安裝virtualenv
$ pip install virtualenv
安裝virtualenv之後,使用help命令
$ virtualenv --help
Virtualenv的使用方法
使用pip freeze確認已經安裝好的所有包的版本信息,當輸入命令後,可看到所有包的清單,這些就是已經安裝在/usr/local/lib/python2.7下的所有包的信息。
$ pip freeze
接着,用virtualenv創建一個供新開發的Python應用程序運行的虛擬環境。先在home目錄下建立一個工作目錄,在該目錄中建立一個虛擬運行環境。
使用virtualenv建立虛擬運行環境,會在work目錄下建立一個新的env目錄,這就是虛擬環境目錄。
$ export VIRTUALENV_USE_DISTRIBUTE=true $ mkdir ~/work $ cd ~/work $ virtualenv env
VIRTUALENV_USE_DISTRIBUTE是向Distribute明示Python運行信息的環境變量(即發佈Python應用時,告知虛擬環境中相關的運行信息)。如果在開發過程中,希望所開發的Python應用程序有“不兼容舊版本的Python”或者“兼容最新版本Python”的要求,最好對該環境變量進行設定。爲了不在每次登錄都輸入這樣的命令,我們可以在登錄的shell配置中加入下面的這條語句。
$ export VIRTUALENV_USE_DISTRIBUTE=true
Distribute會根據這個環境變量是否存在,判斷虛擬運行環境的配置有效或無效。因此在不適用Distribute的時候,建議用unset命令取消該環境變量。
NOTE:
virtualenv的默認設置是創建虛擬運行環境時不使用/usr/local/lib/python2.7/site-packages下的模塊或者包。相反,當我們需要使用系統下的模塊或者包來創建虛擬運行環境的話,可以使用--system-site-packages選項:
$ virtualenv --system-site-packages env
--system-site-packages是在virtualenv版本1.7之後添加的,包括1.6在內的之前版本都默認使用系統下的模塊或者包來創建虛擬運行環境。因此,如果在1.6以前的版本下建立最小虛擬運行環境,可以使用--no-site-packages選項。
$ virtualenv --no-site-packages env
虛擬運行環境激活,當使用了source命令後,虛擬運行環境信息開始生效。
$ source env/bin/activate
virtualenv被激活的狀態
(env) :~/work$
當虛擬運行環境被激活後,再一次使用pip freeze命令來檢查安裝好的包版本信息。
檢查安裝好的包版本信息
(env) $ pip freeze
如此以來,很容易把握在開發Python應用程序時需要安裝的包和模塊,從而儘可能減少其他不相關包和模塊給應用程序開發帶來的未知影響。
退出虛擬運行環境
(env) $ deactivate
當使用virtualenv建立虛擬運行環境來開發應用程序時,千萬不要忘了先激活虛擬運行環境。當不再需要該虛擬環境時(這裏值名爲env的虛擬環境),可以直接使用rm等命令將對應的目錄刪除。
在虛擬環境安裝Python套件
Virtualenv 附帶有pip安裝工具,因此需要安裝的套件可以直接運行:
pip install [套件名稱]
進入虛擬環境後,先執行which pip,確認pip是在虛擬環境下的。
如果系統系統環境下已經安裝了該套件,則虛擬環境將不會被安裝。
如果想在虛擬環境下安裝該套件(而系統環境上已安裝了該套件),只有先從系統環境卸載該套件後,刪除系統環境目錄/usr/lib/python2.7/dist-packages下的相應包文件夾,再在虛擬環境重新安裝該套件。
如果沒有啓動虛擬環境,系統也安裝了pip工具,那麼套件將被安裝在系統環境中。
爲了避免發生此事,可以在~/.bashrc文件中加上:
export PIP_REQUIRE_VIRTUALENV=true
或者讓在執行pip的時候讓系統自動開啓虛擬環境:
export PIP_RESPECT_VIRTUALENV=true