在開(kāi)發(fā)不同的應(yīng)用時(shí),我們可能需要不同的 Python 版本,同時(shí)可能還需要處理包的依賴、版本和間接權(quán)限問(wèn)題。在同系統(tǒng)中,要解決這些問(wèn)題往往非常棘手。在 Python 的開(kāi)發(fā)環(huán)境中,為解決這樣的問(wèn)題最常用的方法是使用 virtualenv 包。 Virtualenv 是一個(gè)用來(lái)創(chuàng)建獨(dú)立的 Python 環(huán)境的包,就類似于一個(gè)沙箱,將開(kāi)發(fā)運(yùn)行環(huán)境與系統(tǒng)隔離開(kāi)來(lái)。
用 VirtualEnv 創(chuàng)建的多個(gè) Python 環(huán)境相互獨(dú)立,互不影響,它能夠:
在沒(méi)有權(quán)限的情況下安裝新套件不同應(yīng)用可以使用不同的套件版本套件升級(jí)不影響其他應(yīng)用這樣的虛擬環(huán)境是在 Python 解釋器上的一個(gè)私有復(fù)制。這樣我們就可以在一個(gè)隔絕的環(huán)境下安裝 packages,不會(huì)影響到系統(tǒng)中全局的 Python 解釋器。虛擬環(huán)境非常有用,因?yàn)樗梢苑乐瓜到y(tǒng)出現(xiàn)包管理混亂和版本沖突的問(wèn)題。為每個(gè)應(yīng)用程序創(chuàng)建一個(gè)虛擬環(huán)境可以確保應(yīng)用程序只能訪問(wèn)它們自己使用的包,從而全局解釋器只作為一個(gè)源且依然整潔干凈去更多的虛擬環(huán)境。另一個(gè)好處是,虛擬環(huán)境不需要管理員權(quán)限。
這里只介紹 linux 系統(tǒng)下的安裝。在 Linux 下的安裝方法多種多樣,可以通過(guò)源碼源碼安裝,也可以用 Python 的包管理工具 easy_install 和 pip 安裝,例如:
$ sudo easy_install virtualenv
或者:
$ sudo pip install virtualenv
如果你使用的是 Ubuntu 及其衍生版本,還可以通過(guò)如下方式安裝:
$ sudo apt-get install python-virtualenv
創(chuàng)建虛擬環(huán)境
安裝完成之后便可用
virtualenv命令創(chuàng)建虛擬環(huán)境,只需要指定一個(gè)虛擬環(huán)境的名稱即可:$ virtualenv kvenv
創(chuàng)建過(guò)程輸出如下信息:
Running virtualenv with interPReter /usr/bin/python2New python executable in kvenv/bin/python2Also creating executable in kvenv/bin/pythonInstalling setuptools, pip...done.創(chuàng)建完成后會(huì)生成一個(gè) kvenv 目錄。也可以根據(jù)需要加上參數(shù)來(lái)指定所創(chuàng)建的虛擬環(huán)境的行為,例如加上
-p參數(shù)指定 Python 版本。激活虛擬環(huán)境
要激活創(chuàng)建的虛擬環(huán)境可以用如下命令:
$ source kvenv/bin/activate
激活成功后會(huì)在命令提示符前邊加上
(kvenv)字符。此時(shí),我們which python看有什么不同:(kvenv)konghy$[~] => which python/home/konghy/kvenv/bin/python會(huì)發(fā)現(xiàn)此時(shí)的 python 解釋器執(zhí)行的是虛擬環(huán)境下的,而不是系統(tǒng)全局的。Virtualenv 拷貝了 Python 可執(zhí)行文件的副本,并創(chuàng)建一些有用的腳本和安裝了項(xiàng)目需要的軟件包,你可以在項(xiàng)目的整個(gè)生命周期中安裝/升級(jí)/刪除這些包。 它也修改了一些搜索路徑,例如PYTHONPATH,以確保:
當(dāng)安裝包時(shí),它們被安裝在當(dāng)前活動(dòng)的virtualenv里,而不是系統(tǒng)范圍內(nèi)的Python路徑。
當(dāng)import代碼時(shí),virtualenv將優(yōu)先采取本環(huán)境中安裝的包,而不是系統(tǒng)Python目錄中安裝的包。
還有一點(diǎn)比較重要,在默認(rèn)情況下,所有安裝在系統(tǒng)范圍內(nèi)的包對(duì)于 virtualenv 是可見(jiàn)的。 這意味著如果你將 simplejson 安裝在您的系統(tǒng) Python 目錄中,它會(huì)自動(dòng)提供給所有的 virtualenvs 使用。 這種行為可以被更改,在創(chuàng)建 virtualenv 時(shí)增加
--no-site-packages 選項(xiàng)的 virtualenv 就不會(huì)讀取系統(tǒng)包,如下:$ virtualenv kvenv --no-site-packages
要
退出虛擬環(huán)境用如下命令:$ deactivate
在虛擬環(huán)境中安裝包
大多數(shù)的 Python 包是通過(guò) pip 程序安裝的,在創(chuàng)建虛擬環(huán)境的時(shí)候 virtualenv 會(huì)自動(dòng)添加進(jìn)去。當(dāng)一個(gè)虛擬環(huán)境被激活后,pip 程序的位置會(huì)被添加到 PATH 中。比如,安裝 Flask 到虛擬環(huán)境中,使用如下命令:
$ pip install flask
安裝過(guò)程會(huì)將 Flask 和它的依賴集安裝到虛擬環(huán)境中。驗(yàn)證是否安裝成功,可以用如下方法:
(venv)$ python>>> import flask>>>用如下命令可以查看當(dāng)前環(huán)境安裝了哪些包:
$ pip freeze
參考資料
http://flask123.sinaapp.com/article/39/
http://www.nowamagic.net/academy/detail/1330228
新聞熱點(diǎn)
疑難解答
圖片精選