vatualenv --- 搭建虛擬環(huán)境(轉(zhuǎn))

原文鏈接:www.cnblogs.com/cheungjustin/archive/2011/12/08/2281041.html? ?侵刪

VirtualEnv用于在一臺機器上創(chuàng)建多個獨立的python運行環(huán)境膀曾,VirtualEnvWrapper為前者提供了一些便利的命令行上的封裝堂氯。

使用 VirtualEnv 的理由:

隔離項目之間的第三方包依賴读跷,如A項目依賴django1.2.5旁趟,B項目依賴django1.3泌枪。

為部署應(yīng)用提供方便惦界,把開發(fā)環(huán)境的虛擬環(huán)境打包到生產(chǎn)環(huán)境即可,不需要在服務(wù)器上再折騰一翻衬潦。

使用說明:

安裝: sudo easy_install virtualenv

建立新的運行環(huán)境:virtualenv

進(jìn)入相應(yīng)的獨立環(huán)境:source /bin/activate

最近無意中看到一本書《Python Testing Cookbook》蜡励,正好我們項目最近要提高測試質(zhì)量境钟,就”翻“來看看锦担。書中介紹了一些方便的工具,比如virtualenv吱韭。

通過virtualenv可以方便的創(chuàng)建一個隔離的python環(huán)境吆豹,即所謂的沙盒。沙盒的好處包括:

解決庫之間的版本依賴理盆,比如同一系統(tǒng)上不同應(yīng)用依賴同一個庫的不同版本痘煤。

解決權(quán)限限制,比如你沒有root權(quán)限猿规。

嘗試新的工具衷快,而不用擔(dān)心污染系統(tǒng)環(huán)境。

當(dāng)然姨俩,virtualenv還是需要安裝到系統(tǒng)環(huán)境的蘸拔,通過easy_install。然后就可以創(chuàng)建沙盒了:

$virtualenv 沙盒名(比如mysandbox)

這個命令會創(chuàng)建一個目錄mysandbox环葵,沙盒的所有內(nèi)容都在該目錄下调窍。在mysandbox/bin目錄下有個定制的python解釋器,它會優(yōu)先使用mysandbox/lib/pythonX.X/site-packages目錄下的庫张遭。通過該解釋器安裝的庫都放在上述目錄中邓萨。

為了方便使用,virtualenv在mysandbox/bin目錄下還提供了兩個腳本:

$source mysandbox/bin/activate : 啟用指定的沙盒。其實只是改變環(huán)境變量PATH中python的路徑缔恳。你會注意到控制臺的前綴變成了 (mysandbox)$宝剖,提示你已經(jīng)進(jìn)入該沙盒環(huán)境。

$source mysandbox/bin/deactivate : 關(guān)閉指定的沙盒歉甚。

之前說到沙盒的解釋器會優(yōu)先查找沙盒的site-packages目錄万细,如果找不到,就會查找系統(tǒng)的site-packages目錄纸泄。我們可以在創(chuàng)建沙盒時加入?yún)?shù)--no-site-packages來禁止它查找系統(tǒng)的目錄赖钞。

virtualenv的作者還無私地推薦了另一個強大的沙盒工具zc.buildout

”Istronglyrecommend anyone doing application development or deployment use one of these tools.“

作者是 MoskyVirtualenv 和 Pythonbrew 都是可以創(chuàng)造虛擬(獨立)Python 環(huán)境的工具刃滓,只是虛擬(獨立)標(biāo)的不同仁烹。

Virtualenv 可以隔離函數(shù)庫需求不同的專案耸弄,讓它們不會互相影響咧虎。在建立並啟動虛擬環(huán)境後,透過pip安裝的套件會被放在虛擬環(huán)境中计呈,專案就可以擁有一個獨立的環(huán)境砰诵。

簡而言之,Virtualenv 可以幫你做到:

在沒有權(quán)限的情況下安裝新套件

不同專案可以使用不同版本的相同套件

套件版本升級時不會影響其他專案

Pythonbrew 則可以在家目錄中安裝多個 Python捌显,並迅速地切換版本茁彭;也可以在指定的 Python 版本下批次測試你的 Python 程式;另外更整合了 Virtualenv扶歪。

這篇文章會詳細(xì)介紹這兩個工具理肺,讓你在多人開發(fā)及多版本開發(fā)的環(huán)境中更得心應(yīng)手。

事前準(zhǔn)備

Python 的 package 通常會上傳至PyPI善镰,有很多工具都可以從PyPI安裝 package妹萨。下面會使用easy_install這個工具(由setuptools提供)來安裝 Virtualenv 和 Pythonbrew。

01. Linux

如果不知道easy_install或還沒安裝 setuptools炫欺,在 Debian/Ubuntu 可以用下列指令安裝:

$ sudo apt-get install python-setuptools

在 Fedora/CentOS/Redhat/openSUSE乎完,則可以使用:

$ su -

# yum install python-setuptools

02. Windows

在 Windows 則可以從setuptools的頁面找到*.exe格式的安裝檔案。安裝完後品洛,可以在C:\PythonX.Y\Scripts\(X.Y 是 Python 的版本)下找到easy_install.exe树姨。記得把這個路徑放進(jìn) Windows 環(huán)境變數(shù)中的 PATH。

接著就可以輕鬆安裝任何在PyPI的 Python Package 囉桥状。

Virtualenv- Virtual Python Environment builder

01. 安裝

Pythonbrew 已整合了 Virtualenv帽揪,如果不想額外安裝一個套件,也可以不要裝 Virtualenv辅斟。

如果需要安裝转晰,請於命令列模式下輸入下列指令:

# easy_install virtualenv

02. 使用方法

I. 建立虛擬環(huán)境

請於命令列模式下輸入下列指令:

$ virtualenv [指定虛擬環(huán)境的名稱]

例如下列指令會建立名為 "ENV" 的虛擬環(huán)境:

$ virtualenv ENV

預(yù)設(shè)在建立虛擬環(huán)境時,會依賴系統(tǒng)環(huán)境中的 site packages,如果想完全不依賴系統(tǒng)的 packages挽霉,可以加上參數(shù)--no-site-packages來建立虛擬環(huán)境:

$ virtualenv --no-site-packages [指定虛擬環(huán)境的名稱]

II.啟動虛擬環(huán)境

請先切換當(dāng)前目錄至建立的虛擬環(huán)境中防嗡。前例中,建立名稱為 "ENV"侠坎,則:

$ cd ENV

接著蚁趁,啟動虛擬環(huán)境:

$ source bin/activate

在 Windows 環(huán)境中則改用:

> \path\to\env\Scripts\activate.bat

然後就可以注意到,在 shell 提示字元的最前面多了虛擬環(huán)境的名稱提示:

(ENV) ...$

III. 退出虛擬環(huán)境

請於命令列模式下輸入下列指令:

$ deactivate

就可以回到系統(tǒng)原先的 Python 環(huán)境实胸。

IV. 在虛擬環(huán)境安裝新的 Python 套件

Virtualenv 在安裝時會附帶pip這個 Python 的套件安裝工具他嫡,當(dāng)虛擬環(huán)境被啟動時,由它安裝的 package 會出現(xiàn)在虛擬環(huán)境的資料夾中庐完,用法是:

(ENV)...$ pip install [套件名稱]

如果系統(tǒng)也有安裝pip钢属,請?zhí)貏e注意是否已經(jīng)啟動虛擬環(huán)境,否則套件會被安裝到系統(tǒng)中门躯,而非虛擬環(huán)境裡淆党。

如果想要避免pip在沒有進(jìn)入虛擬環(huán)境時被使用,可以在~/.bashrc加上:

export PIP_REQUIRE_VIRTUALENV=true

要求pip一定要在虛擬環(huán)境中執(zhí)行讶凉。

也可以用下面的設(shè)定染乌,讓系統(tǒng)的pip自動使用啟動中的虛擬環(huán)境。

export PIP_RESPECT_VIRTUALENV=true

避免意外將套件安裝至系統(tǒng)環(huán)境懂讯。

V. 從程式中指定使用虛擬環(huán)境的函數(shù)庫

無法從 Shell 啟動虛擬環(huán)境的情況荷憋,像是使用mod_pythonmod_wsgi,這時可以在 Python 的程式中加上:

activate_this = '/path/to/env/bin/activate_this.py'

execfile(activate_this, dict(__file__=activate_this))

來使用安裝在虛擬環(huán)境中的 packages褐望。

03. 延伸套件:Virtualenvwrapper

Virtualenvwrapper 是一個 Virtualenv 的 extension勒庄,可使虛擬環(huán)境的管理變得更容易。

詳細(xì)來說瘫里,Virtualenvwrapper 提供下述功能:

將所有的虛擬環(huán)境整合在一個目錄下实蔽。

管理(新增、移除减宣、複製)所有的虛擬環(huán)境盐须。

可以使用一個命令切換虛擬環(huán)境。

Tab 補全虛擬環(huán)境的名字漆腌。

每個操作都提供允許使用者自訂的 hooks贼邓。

可撰寫容易分享的 extension plugin 系統(tǒng)。

I. 安裝

請於命令列模式下輸入下列指令:

# easy_install virtualenvwrapper

II. 使用方法

於$WORKON_HOME製作虛擬環(huán)境:

$ mkvirtualenv [-i package] [-r requirements_file] [virtualenv options] ENVNAME

列出所有的虛擬環(huán)境:

$ lsvirtualenv [-b] [-l] [-h]

-b是簡短模式闷尿;-l是詳細(xì)模式(預(yù)設(shè))塑径;-h是印出 help 資訊。

移除虛擬環(huán)境:

$ rmvirtualenv ENVNAME

複製虛擬環(huán)境:

$ cpvirtualenv ENVNAME TARGETENVNAME

啟動虛擬環(huán)境:

$ workon [environment_name]

如果只輸入workon填具,則會列出所有的虛擬環(huán)境统舀。

離開虛擬環(huán)境一樣是使用deactivate匆骗。

可以使用下面的設(shè)定來告訴pipVirtualenv 的路徑。

export PIP_VIRTUALENV_BASE=$WORKON_HOME

Virtualenvwrapper 的功能當(dāng)然不只如此誉简,更多功能可以參考Virtualenvwrapper 的官方文件碉就。

Pythonbrew

01. 安裝

Pythonbrew 是個比較新的專案,雖然比較新闷串,卻非常完整瓮钥。它也有整合上面介紹的 Virtualenv∨氤常可以用類似 Virtualenvwrapper 的方式來操作 Virtualenv碉熄。

安裝方式與 Virtualenv 一樣,只要輸入下面的指令就可以了:

# easy_install $ pythonbrew

Pythonbrew 官方有推薦的安裝方式肋拔,但這篇教學(xué)為求一致性锈津,就不額外介紹了,可以參考pythonbrew/README.rst凉蜂。

對於 Windows 的使用者琼梆,很可惜地,Pythonbrew 暫時沒有支援 Windows 的計畫 (#6: Windows Support? - Issues - utahta/pythonbrew - GitHub)跃惫。所以 Windows 暫時還沒辦法使用 Pythonbrew 囉叮叹。

經(jīng)過easy_install的安裝後,還需要在 shell 執(zhí)行:

$ pythonbrew_install

才會把初始的設(shè)定檔和資料夾配置進(jìn)你的家目錄爆存。接著要修改~/.bashrc的配置:

$ echo "source ~/.pythonbrew/etc/bashrc" >> ~/.bashrc

這樣就算安裝完全囉。

Pythonbrew 使用curl來抓取資料蝗砾,如果你的系統(tǒng)沒有先较,請記得安裝。Ubuntu 上可以使用這行指令:

$ sudo apt-get install curl

02. 編譯前準(zhǔn)備

因為 Pythonbrew 採取下載 tarball悼粮,並編譯闲勺、安裝的方法,所以我們要先為系統(tǒng)準(zhǔn)備好編譯 Python 所需的套件扣猫。

也因為許多 Linux 發(fā)行版都已打包 Python菜循,所以我們可以偷懶一點,用已經(jīng)打包好的套件來解決編譯所需的相依性申尤。在 Ubuntu/Debian 上癌幕,可以透過:

$ sudo apt-get build-dep python2.7

來安裝所有編譯 Python 2.7 所需的套件。雖然已經(jīng)能夠安裝得相當(dāng)完整昧穿,但還是缺少了gdbm這個 module勺远,如果需要的話,可以透過:

$ sudo apt-get build-dep python-gdbm

來安裝編譯gdbm所需的套件时鸵。

註:bsddb185胶逢、linuxaudiodev、ossaudiodev、sunaudiodev等是按以上方式安裝後初坠,仍會缺少的 module和簸。其中ossaudiodev(Open Sound System)在隨 Ubuntu 發(fā)布的 Python 中有提供,列出來讓大家參考碟刺。

Fedora/CentOS/Redhat/openSUSE 則可以使用yum-builddep這個指令比搭。

03. 使用方法

Pythonbrew 的操作不外乎安裝、移除南誊、列出及使用新的 Python 版本身诺,下面是依照初次使用時所需的指令順序來介紹。

I. 列出可安裝的版本

首先我們用list --know列出可以安裝的 Python 版本:

$ pythonbrew list --know

II. 安裝新的版本

接著利用install VERSION來下載並編譯 Python 到本機抄囚,除了接 Python 的版本編號以外霉赡,也可以接 Python 的 tarball 路徑或網(wǎng)址來安裝;也能調(diào)整編譯 Python 的選項幔托。下面是一些例子:

$ pythonbrew install 2.7.2

$ pythonbrew install --verbose 2.7.2

$ pythonbrew install --force 2.7.2

$ pythonbrew install --no-test 2.7.2

$ pythonbrew install --configure="CC=gcc_4.1" 2.7.2

$ pythonbrew install --no-setuptools 2.7.2

$ pythonbrew install http://www.python.org/ftp/python/2.7/Python-2.7.2.tgz

$ pythonbrew install /path/to/Python-2.7.2.tgz

$ pythonbrew install /path/to/Python-2.7.2

$ pythonbrew install 2.7.2 3.2

III. 清理安裝時產(chǎn)生的檔案

下載的 Python tarball 會放在~/.pythonbrew/dists/下穴亏;而編譯則會在~/.pythonbrew/build/下進(jìn)行。如果想清理這兩個目錄重挑,可以使用:

$ pythonbrew cleanup

IV. 列出所有已安裝的版本

安裝好之後嗓化,可以使用list命令列出所有已安裝的 Python 版本:

$ pythonbrew list

後面有打星號的,就是現(xiàn)在正在使用的 Python 版本谬哀。

V. 切換已安裝的版本

可以使用switch來切換預(yù)設(shè)的 Python 版本:

$ pythonbrew switch VERSION

如果只想在當(dāng)前的 shell 下切換刺覆,可以使用use:

$ pythonbrew use VERSION

要切換回預(yù)設(shè)的環(huán)境時,使用off:

$ pythonbrew off

就會返回系統(tǒng)環(huán)境的 Python 了史煎。

VI. 批次在不同版本下測試

最重要的是谦屑,可以用系統(tǒng)內(nèi)所有安裝過的 Python 版本,或指定的 Python 版本來測試自己的程式篇梭!

$ pythonbrew py test.py # 使用所有有安裝的版本

$ pythonbrew py -v test.py # 詳細(xì)輸出

$ pythonbrew py -p 2.7.2 -p 3.2 test.py # 指定特定的版本

VII. 移除已安裝的版本

若想移除已經(jīng)安裝的 Python氢橙,則可以使用uninstall:

$ pythonbrew uninstall 2.7.2

$ pythonbrew uninstall 2.7.2 3.2

VIII. 與 Virtualenv 的整合

要注意 Pythonbrew 中所提供的 Virtualenv,是基於 Pythonbrew 中所安裝的 Python(置於~/.pythonbrew/venvs/Python-VERSION/下)恬偷。在不使用 Pythonbrew 的情況下悍手,無法使用附屬於 Pythonbrew 的venv功能。

Pythonbrew 提供了和 Virtualenvwrapper 類似的功能袍患,只是沒有像 Virtualenvwrapper 那麼完整的 plugin 系統(tǒng)坦康。所有在 Pythonbrew 中的 Virtualenv 指令都以venv作為第一個副命令。

$ pythonbrew venv create [指定虛擬環(huán)境的名稱]

$ pythonbrew venv list

$ pythonbrew venv use [指定虛擬環(huán)境的名稱]

$ pythonbrew venv delete [指定虛擬環(huán)境的名稱]

離開虛擬環(huán)境一樣是使用deactivate协怒。

IX. Buildout

如果有使用Buildout這個工具涝焙,也可以透過 Pythonbrew 來執(zhí)行:

$ pythonbrew buildout

$ pythonbrew buildout -p 2.6.6 # 指定版本

X. 自我更新

最後,Pythonbrew 有內(nèi)建更新自己的指令:

$ pythonbrew update

$ pythonbrew update --master

$ pythonbrew update --develop

Virtualenv 和 Pythonbrew 就介紹到這邊孕暇,如果想獲得更多資訊仑撞,可以多多參考它們的官網(wǎng)哦赤兴。祝大家玩得愉快。

參考資料

www.virtualenv.org

utahta/pythonbrew - GitHub

setuptools - PyPI

pip - PyPI

virtualenvwrapper documentaion

Building Python and more on missing modules - Stack Overflow

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隧哮,一起剝皮案震驚了整個濱河市桶良,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沮翔,老刑警劉巖陨帆,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異采蚀,居然都是意外死亡疲牵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門榆鼠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纲爸,“玉大人,你說我怎么就攤上這事妆够∈独玻” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵神妹,是天一觀的道長颓哮。 經(jīng)常有香客問我,道長鸵荠,這世上最難降的妖魔是什么冕茅? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮腰鬼,結(jié)果婚禮上嵌赠,老公的妹妹穿的比我還像新娘。我一直安慰自己熄赡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布齿税。 她就那樣靜靜地躺著彼硫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凌箕。 梳的紋絲不亂的頭發(fā)上拧篮,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音牵舱,去河邊找鬼串绩。 笑死,一個胖子當(dāng)著我的面吹牛芜壁,可吹牛的內(nèi)容都是我干的礁凡。 我是一名探鬼主播高氮,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼顷牌!你這毒婦竟也來了剪芍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤窟蓝,失蹤者是張志新(化名)和其女友劉穎罪裹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體运挫,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡状共,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谁帕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峡继。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雇卷,靈堂內(nèi)的尸體忽然破棺而出鬓椭,到底是詐尸還是另有隱情,我是刑警寧澤关划,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布小染,位于F島的核電站,受9級特大地震影響贮折,放射性物質(zhì)發(fā)生泄漏裤翩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一调榄、第九天 我趴在偏房一處隱蔽的房頂上張望踊赠。 院中可真熱鬧,春花似錦每庆、人聲如沸筐带。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伦籍。三九已至,卻和暖如春腮出,著一層夾襖步出監(jiān)牢的瞬間帖鸦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工胚嘲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留作儿,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓馋劈,卻偏偏與公主長得像攻锰,于是被迫代替她去往敵國和親晾嘶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容