vatualenv --- 搭建虚拟环境(转)

原文链接:www.cnblogs.com/cheungjustin/archive/2011/12/08/2281041.html   侵删

VirtualEnv用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前者提供了一些便利的命令行上的封装。

使用 VirtualEnv 的理由:

隔离项目之间的第三方包依赖,如A项目依赖django1.2.5,B项目依赖django1.3。

为部署应用提供方便,把开发环境的虚拟环境打包到生产环境即可,不需要在服务器上再折腾一翻。

使用说明:

安装: sudo easy_install virtualenv

建立新的运行环境:virtualenv

进入相应的独立环境:source /bin/activate

最近无意中看到一本书《Python Testing Cookbook》,正好我们项目最近要提高测试质量,就”翻“来看看。书中介绍了一些方便的工具,比如virtualenv

通过virtualenv可以方便的创建一个隔离的python环境,即所谓的沙盒。沙盒的好处包括:

解决库之间的版本依赖,比如同一系统上不同应用依赖同一个库的不同版本。

解决权限限制,比如你没有root权限。

尝试新的工具,而不用担心污染系统环境。

当然,virtualenv还是需要安装到系统环境的,通过easy_install。然后就可以创建沙盒了:

$virtualenv 沙盒名(比如mysandbox)

这个命令会创建一个目录mysandbox,沙盒的所有内容都在该目录下。在mysandbox/bin目录下有个定制的python解释器,它会优先使用mysandbox/lib/pythonX.X/site-packages目录下的库。通过该解释器安装的库都放在上述目录中。

为了方便使用,virtualenv在mysandbox/bin目录下还提供了两个脚本:

$source mysandbox/bin/activate : 启用指定的沙盒。其实只是改变环境变量PATH中python的路径。你会注意到控制台的前缀变成了 (mysandbox)$,提示你已经进入该沙盒环境。

$source mysandbox/bin/deactivate : 关闭指定的沙盒。

之前说到沙盒的解释器会优先查找沙盒的site-packages目录,如果找不到,就会查找系统的site-packages目录。我们可以在创建沙盒时加入参数--no-site-packages来禁止它查找系统的目录。

virtualenv的作者还无私地推荐了另一个强大的沙盒工具zc.buildout

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

作者是 MoskyVirtualenv 和 Pythonbrew 都是可以創造虛擬(獨立)Python 環境的工具,只是虛擬(獨立)標的不同。

Virtualenv 可以隔離函數庫需求不同的專案,讓它們不會互相影響。在建立並啟動虛擬環境後,透過pip安裝的套件會被放在虛擬環境中,專案就可以擁有一個獨立的環境。

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

在沒有權限的情況下安裝新套件

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

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

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

這篇文章會詳細介紹這兩個工具,讓你在多人開發及多版本開發的環境中更得心應手。

事前準備

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。記得把這個路徑放進 Windows 環境變數中的 PATH。

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

Virtualenv- Virtual Python Environment builder

01. 安裝

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

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

# easy_install virtualenv

02. 使用方法

I. 建立虛擬環境

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

$ virtualenv [指定虛擬環境的名稱]

例如下列指令會建立名為 "ENV" 的虛擬環境:

$ virtualenv ENV

預設在建立虛擬環境時,會依賴系統環境中的 site packages,如果想完全不依賴系統的 packages,可以加上參數--no-site-packages來建立虛擬環境:

$ virtualenv --no-site-packages [指定虛擬環境的名稱]

II.啟動虛擬環境

請先切換當前目錄至建立的虛擬環境中。前例中,建立名稱為 "ENV",則:

$ cd ENV

接著,啟動虛擬環境:

$ source bin/activate

在 Windows 環境中則改用:

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

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

(ENV) ...$

III. 退出虛擬環境

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

$ deactivate

就可以回到系統原先的 Python 環境。

IV. 在虛擬環境安裝新的 Python 套件

Virtualenv 在安裝時會附帶pip這個 Python 的套件安裝工具,當虛擬環境被啟動時,由它安裝的 package 會出現在虛擬環境的資料夾中,用法是:

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

如果系統也有安裝pip,請特別注意是否已經啟動虛擬環境,否則套件會被安裝到系統中,而非虛擬環境裡。

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

export PIP_REQUIRE_VIRTUALENV=true

要求pip一定要在虛擬環境中執行。

也可以用下面的設定,讓系統的pip自動使用啟動中的虛擬環境。

export PIP_RESPECT_VIRTUALENV=true

避免意外將套件安裝至系統環境。

V. 從程式中指定使用虛擬環境的函數庫

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

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

execfile(activate_this, dict(__file__=activate_this))

來使用安裝在虛擬環境中的 packages。

03. 延伸套件:Virtualenvwrapper

Virtualenvwrapper 是一個 Virtualenv 的 extension,可使虛擬環境的管理變得更容易。

詳細來說,Virtualenvwrapper 提供下述功能:

將所有的虛擬環境整合在一個目錄下。

管理(新增、移除、複製)所有的虛擬環境。

可以使用一個命令切換虛擬環境。

Tab 補全虛擬環境的名字。

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

可撰寫容易分享的 extension plugin 系統。

I. 安裝

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

# easy_install virtualenvwrapper

II. 使用方法

於$WORKON_HOME製作虛擬環境:

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

列出所有的虛擬環境:

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

-b是簡短模式;-l是詳細模式(預設);-h是印出 help 資訊。

移除虛擬環境:

$ rmvirtualenv ENVNAME

複製虛擬環境:

$ cpvirtualenv ENVNAME TARGETENVNAME

啟動虛擬環境:

$ workon [environment_name]

如果只輸入workon,則會列出所有的虛擬環境。

離開虛擬環境一樣是使用deactivate。

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

export PIP_VIRTUALENV_BASE=$WORKON_HOME

Virtualenvwrapper 的功能當然不只如此,更多功能可以參考Virtualenvwrapper 的官方文件

Pythonbrew

01. 安裝

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

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

# easy_install $ pythonbrew

Pythonbrew 官方有推薦的安裝方式,但這篇教學為求一致性,就不額外介紹了,可以參考pythonbrew/README.rst

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

經過easy_install的安裝後,還需要在 shell 執行:

$ pythonbrew_install

才會把初始的設定檔和資料夾配置進你的家目錄。接著要修改~/.bashrc的配置:

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

這樣就算安裝完全囉。

Pythonbrew 使用curl來抓取資料,如果你的系統沒有,請記得安裝。Ubuntu 上可以使用這行指令:

$ sudo apt-get install curl

02. 編譯前準備

因為 Pythonbrew 採取下載 tarball,並編譯、安裝的方法,所以我們要先為系統準備好編譯 Python 所需的套件。

也因為許多 Linux 發行版都已打包 Python,所以我們可以偷懶一點,用已經打包好的套件來解決編譯所需的相依性。在 Ubuntu/Debian 上,可以透過:

$ sudo apt-get build-dep python2.7

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

$ sudo apt-get build-dep python-gdbm

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

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

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

03. 使用方法

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

I. 列出可安裝的版本

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

$ pythonbrew list --know

II. 安裝新的版本

接著利用install VERSION來下載並編譯 Python 到本機,除了接 Python 的版本編號以外,也可以接 Python 的 tarball 路徑或網址來安裝;也能調整編譯 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. 清理安裝時產生的檔案

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

$ pythonbrew cleanup

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

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

$ pythonbrew list

後面有打星號的,就是現在正在使用的 Python 版本。

V. 切換已安裝的版本

可以使用switch來切換預設的 Python 版本:

$ pythonbrew switch VERSION

如果只想在當前的 shell 下切換,可以使用use:

$ pythonbrew use VERSION

要切換回預設的環境時,使用off:

$ pythonbrew off

就會返回系統環境的 Python 了。

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

最重要的是,可以用系統內所有安裝過的 Python 版本,或指定的 Python 版本來測試自己的程式!

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

$ pythonbrew py -v test.py # 詳細輸出

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

VII. 移除已安裝的版本

若想移除已經安裝的 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 系統。所有在 Pythonbrew 中的 Virtualenv 指令都以venv作為第一個副命令。

$ pythonbrew venv create [指定虛擬環境的名稱]

$ pythonbrew venv list

$ pythonbrew venv use [指定虛擬環境的名稱]

$ pythonbrew venv delete [指定虛擬環境的名稱]

離開虛擬環境一樣是使用deactivate。

IX. Buildout

如果有使用Buildout這個工具,也可以透過 Pythonbrew 來執行:

$ pythonbrew buildout

$ pythonbrew buildout -p 2.6.6 # 指定版本

X. 自我更新

最後,Pythonbrew 有內建更新自己的指令:

$ pythonbrew update

$ pythonbrew update --master

$ pythonbrew update --develop

Virtualenv 和 Pythonbrew 就介紹到這邊,如果想獲得更多資訊,可以多多參考它們的官網哦。祝大家玩得愉快。

參考資料

www.virtualenv.org

utahta/pythonbrew - GitHub

setuptools - PyPI

pip - PyPI

virtualenvwrapper documentaion

Building Python and more on missing modules - Stack Overflow

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容