Linux下使用 virtualenv 虛擬獨立 Python 環境

派森學python發表於2019-02-16

簡介

在開發不同的應用時,我們可能需要不同的 Python 版本,同時可能還需要處理包的依賴、版本和間接許可權問題。在同系統中,要解決這些問題往往非常棘手。在 Python 的開發環境中,為解決這樣的問題最常用的方法是使用 virtualenv 包。 Virtualenv 是一個用來建立獨立的 Python 環境的包,就類似於一個沙箱,將開發執行環境與系統隔離開來。

用 VirtualEnv 建立的多個 Python 環境相互獨立,互不影響,它能夠:

  • 在沒有許可權的情況下安裝新套件
  • 不同應用可以使用不同的套件版本
  • 套件升級不影響其他應用

這樣的虛擬環境是在 Python 直譯器上的一個私有複製。這樣我們就可以在一個隔絕的環境下安裝 packages,不會影響到系統中全域性的 Python 直譯器。虛擬環境非常有用,因為它可以防止系統出現包管理混亂和版本衝突的問題。為每個應用程式建立一個虛擬環境可以確保應用程式只能訪問它們自己使用的包,從而全域性直譯器只作為一個源且依然整潔乾淨去更多的虛擬環境。另一個好處是,虛擬環境不需要管理員許可權。

安裝

這裡只介紹 Linux 系統下的安裝。在 Linux 下的安裝方法多種多樣,可以通過原始碼原始碼安裝,也可以用 Python 的包管理工具 easy_installpip 安裝,例如:

$ sudo easy_install virtualenv

或者:

$ sudo pip install virtualenv

如果你使用的是 Ubuntu 及其衍生版本,還可以通過如下方式安裝:

$ sudo apt-get install python-virtualenv

建立虛擬環境

安裝完成之後便可用 virtualenv 命令建立虛擬環境,只需要指定一個虛擬環境的名稱即可:

$ virtualenv kvenv

建立過程輸出如下資訊:

Running virtualenv with interpreter /usr/bin/python2
New python executable in kvenv/bin/python2
Also creating executable in kvenv/bin/python
Installing setuptools, pip...done.

建立完成後會生成一個 kvenv 目錄。也可以根據需要加上引數來指定所建立的虛擬環境的行為,例如加上 -p 引數指定 Python 版本。

啟用虛擬環境

要啟用建立的虛擬環境可以用如下命令:

$ source kvenv/bin/activate

啟用成功後會在命令提示符前邊加上 (kvenv) 字元。此時,我們 which python 看有什麼不同:

(kvenv)konghy$[~] => which python
/home/konghy/kvenv/bin/python

會發現此時的 python 直譯器執行的是虛擬環境下的,而不是系統全域性的。Virtualenv 拷貝了 Python 可執行檔案的副本,並建立一些有用的指令碼和安裝了專案需要的軟體包,你可以在專案的整個生命週期中安裝/升級/刪除這些包。 它也修改了一些搜尋路徑,例如PYTHONPATH,以確保:

  • 當安裝包時,它們被安裝在當前活動的virtualenv裡,而不是系統範圍內的Python路徑。
  • 當import程式碼時,virtualenv將優先採取本環境中安裝的包,而不是系統Python目錄中安裝的包。

還有一點比較重要,在預設情況下,所有安裝在系統範圍內的包對於 virtualenv 是可見的。 這意味著如果你將 simplejson 安裝在您的系統 Python 目錄中,它會自動提供給所有的 virtualenvs 使用。 這種行為可以被更改,在建立 virtualenv 時增加 --no-site-packages 選項的 virtualenv 就不會讀取系統包,如下:

$ virtualenv kvenv –no-site-packages

退出虛擬環境用如下命令:

$ deactivate

在虛擬環境中安裝包

大多數的 Python 包是通過 pip 程式安裝的,在建立虛擬環境的時候 virtualenv 會自動新增進去。當一個虛擬環境被啟用後,pip 程式的位置會被新增到 PATH 中。比如,安裝 Flask 到虛擬環境中,使用如下命令:

$ pip install flask

安裝過程會將 Flask 和它的依賴集安裝到虛擬環境中。驗證是否安裝成功,可以用如下方法:

(venv)$ python
>>> import flask
>>>

用如下命令可以檢視當前環境安裝了哪些包:

$ pip freeze

參考資料

http://flask123.sinaapp.com/a…

http://www.nowamagic.net/acad…

相關文章