用virtualenv建立多個Python獨立開發環境
- Chapter: Python Web部署的背景知識
不同的人喜歡用不同的方式建立各自的開發環境,但在幾乎所有的編程社區,總有一個(或一個以上)開發環境讓人更容易接受。 使用不同的開發環境雖然沒有什么錯誤,但有些環境設置更容易進行便利的測試,並做一些重復/模板化的任務,使得在每天的日常工作簡單並易於維護。
什么是virtualenv?
在Python的開發環境的最常用的方法是使用 virtualenv 包。 Virtualenv是一個用來創建獨立的Python環境的包。現在,出現了這樣的問題:為什么我們需要一個獨立的Python環境? 要回答這個問題,請允許我引用virtualenv自己的文檔:
virtualenv is a tool to create isolated Python environments.
The basic problem being addressed is one of dependencies and versions, and indirectly permissions. Imagine you have an application that needs version 1 of LibFoo, but another application requires version 2. How can you use both these applications? If you install everything into /usr/lib/python2.7/site-packages (or whatever your platform’s standard location is), it’s easy to end up in a situation where you unintentionally upgrade an application that shouldn’t be upgraded.
Or more generally, what if you want to install an application and leave it be? If an application works, any change in its libraries or the versions of those libraries can break the application.
Also, what if you can’t install packages into the global site-packages directory? For instance, on a shared host.
In all these cases, virtualenv can help you. It creates an environment that has its own installation directories, that doesn’t share libraries with other virtualenv environments (and optionally doesn’t access the globally installed libraries either).
我們需要處理的基本問題是包的依賴、版本和間接權限問題。想象一下,你有兩個應用,一個應用需要libfoo的版本1,而另一應用需要版本2。如何才能同時使用這些應用程序?如果您安裝到的/usr/lib/python2.7/site-packages(或任何平台的標准位置)的一切,在這種情況下,您可能會不小心升級不應該升級的應用程序。
簡單地說,你可以為每個項目建立不同的/獨立的Python環境,你將為每個項目安裝所有需要的軟件包到它們各自獨立的環境中。
安裝與使用virtualenv
安裝 virtualenv 很簡單:
1 |
pip install virtualenv |
virtualenv安裝完畢后,可以通過運行下面的命令來為你的項目創建獨立的python環境:
1 |
mkdir nowamagic_venv |
2 |
virtualenv --distribute nowamagic_venv |
OK,成功。上面發生了什么?你創建了文件夾 nowamagic_venv 來存儲你的新的獨立Python環境。 這個文件夾位於 /root 下面。
我們再來看看輸出:
1 |
New python executable in nowamagic_venv/bin/python2.7 |
2 |
Also creating executable in nowamagic_venv/bin/python |
3 |
Installing Setuptools...... done . |
4 |
Installing Pip........... done . |
--distribute 選項使virtualenv使用新的基於發行版的包管理系統而不是 setuptools 獲得的包。 你現在需要知道的就是 --distribute 選項會自動在新的虛擬環境中安裝 pip ,這樣就不需要手動安裝了。 當你成為一個更有經驗的Python開發者,你就會明白其中細節。

- activate:這個virtualenv的激活文件
- pip:這個virtualenv的獨立pip
- python:python解釋器的一個副本
- lib/python2.7:所有的新包會被存在這
試驗一下
通過下面的命令激活這個virtualenv:
1 |
[root@nowamagic ~] # cd nowamagic_venv |
2 |
[root@nowamagic nowamagic_venv] # source bin/activate |
3 |
(nowamagic_venv)[root@nowamagic nowamagic_venv] # |
運行下面的命令可以更好地理解兩者的差異,如果已經進入virtualenv請先離開。
1 |
deactivate #離開 |
首先讓我們看看如果調用python/pip命令它會調用那一個。
1 |
[root@nowamagic ~] # which python |
2 |
/usr/bin/python |
1 |
[root@nowamagic ~] # which pip |
2 |
/usr/ local /bin/pip |
再來一次!這次打開virtualenv,然后看看有什么不同。我的機子上顯示如下:
1 |
[root@nowamagic ~] # which python |
2 |
/root/nowamagic_venv/bin/python |
1 |
[root@nowamagic ~] # which pip |
2 |
/root/nowamagic_venv/bin/pip |
virtualenv拷貝了Python可執行文件的副本,並創建一些有用的腳本和安裝了項目需要的軟件包,你可以在項目的整個生命周期中安裝/升級/刪除這些包。 它也修改了一些搜索路徑,例如PYTHONPATH,以確保:
- 當安裝包時,它們被安裝在當前活動的virtualenv里,而不是系統范圍內的Python路徑。
- 當import代碼時,virtualenv將優先采取本環境中安裝的包,而不是系統Python目錄中安裝的包。
還有一點比較重要,在默認情況下,所有安裝在系統范圍內的包對於virtualenv是可見的。 這意味着如果你將simplejson安裝在您的系統Python目錄中,它會自動提供給所有的virtualenvs使用。 這種行為可以被更改,在創建virtualenv時增加 --no-site-packages 選項的virtualenv就不會讀取系統包,如下:
1 |
virtualenv nowamagic_venv --no-site-packages |
Windows 下pip安裝以及virtualenv環境搭建
微信公眾號" IT程序猿進化史", 共同學習進化~
1、確保已安裝python環境
2、進入python的官網下載工具,網址如下:https://pypi.python.org/pypi/setuptools
3、 找到ez_setup.py,點擊下載,或者點擊將其中內容進行復制,在本地創建文件ez_setup.py,將內容粘貼進去。
4、 雙擊運行下載好的文件,運行成功后,進入Python安裝目錄下Scripts文件夾下,發現easy_install以及pip相關文件已正常添加。
5、 為了方便在cmd下使用常用命令,將Scripts文件夾路徑添加到環境變量中,假設你在缺省路徑安裝了 Python 2.7 ,那么就應該添加如下內容:
;C:\Python27\Scripts
6、 至此pip/easy_install安裝完畢。
7、 打開cmd窗口,切換到合適路徑下,輸入命令
>pip install virtualenv
8、 安裝完畢后發現Scripts目錄下,virtualenv相關文件已正常添加
9、 至此全部環境搭建成功~
10、進入一個希望創建虛擬Python環境的文件夾下,輸入命令:
>virtualenv venv
cmd 的當前目錄下面多了一個 venv 文件夾,這個文件夾保存着當前Python虛擬環境。
11、 virtualenv命令使用
開啟:
>\venv\Scripts\activate
關閉:
>\venv\Scripts\deactivate
查看當前虛擬環境配置信息
>\venv\Scripts\activate
>pip list
-------------------
windows下使用virtualenv
virtualenv使用:
-
安裝
pip install virtualenv
-
創建虛擬環境
virtualenv env
-
啟動虛擬環境
.\env\Scripts\activate.bat
-
查看虛擬環境安裝的python包
pip install package
easy_install package[.exe|.egg]
-
退出虛擬環境
deactivate
在windows上也提供了virtualenvwrapper
-
安裝
pip install virtualenvwrapper-win
可設置環境變量WORKON_HOME指定virtualenvwrapper虛擬環境默認路徑 -
創建虛擬環境
mkvirtualenv env
-
查看所有虛擬環境和啟動虛擬環境
lsvirtualenv
workon
workon env
-
退出虛擬環境
deactivate
-
將指定路徑添加到sitepackages目錄下的virtualenv_path_extensions.pth中可以直接進行import,在啟動虛擬環境時則添加到虛擬環境中,在未啟動則添加到默認python環境中
add2virtualenv path
-
其他命令
cdproject: 切換目錄到當前指定的project目錄下, 使用前需要使用setprojectdir進行設置
cdvirtualenv: 切換到當前虛擬環境目錄下
cdsitepackages: 切換到當前虛擬環境的sitepackages下
lssitepackages: 查看當前虛擬環境的sitepackages目錄下的包
setprojectdir path: 設置project目錄
toggleglobalsitepackages:啟用/關閉系統sitepackages
whereis file:查看文件路徑
-------------------
1. virtualenv 用來建立一個虛擬的python環境,一個專屬於項目的python環境。用virtualenv 來保持一個干凈的環境非常有用。
2. pip 用來解決項目依賴問題。將項目所有依賴的第三方庫寫在一個requirements.txt 中用pip 批量安裝。一般和virtualenv 配合使用,將所有包安裝在virtualenv 的環境中。
3. fabric 用來自動化遠程部署項目,非常的方便。可以根據需要在本地、遠程依次執行一系列shell 命令、程序等。比如從代碼庫更新代碼,執行數據遷移腳本,重啟服務進程,完成自動化的部署。
相比virtualenv和pip, buildout才是真正的好東西, 不論是虛擬python環境的干凈程度, 用法的方便度, 對安裝包的可定制/操控度, 還是對批量部署的支持都是遠超前者. 可以說 virtualenv + pip 還停留在手工時代, 而buildout 已經進入了機械時代.
至於 fabric, 的確是個好工具 簡簡單單一個 fabfile 就可以實現代碼的批量部署和管理, 並且也可以選擇不用它的fab命令而自己基於它的api進行深度開發, 唯一的弱點就是對ssh的依賴略重了吧.
另外推薦另一個好工具 supervisor.