第十二節:虛擬環境和包

第十二節:虛擬環境和包

第十二節:虛擬環境和包

12。 虛擬環境和包

12。1。 簡介

Python 應用程式經常會使用一些不屬於標準庫的包和模組。應用程式有時候需要某個特定版本的庫,因為它需要一個特定的 bug 已得到修復的庫或者它是使用了一個過時版本的庫的介面編寫的。

這就意味著可能無法安裝一個 Python 來滿足每個應用程式的要求。如果應用程式 A 需要一個特定模組的 1。0 版本但是應用程式 B 需要該模組的 2。0 版本,這兩個應用程式的要求是衝突的,安裝版本 1。0 或者版本 2。0 將會導致其中一個應用程式不能執行。

這個問題的解決方案就是建立一個 虛擬環境 (通常簡稱為 “virtualenv”),包含一個特定版本的 Python,以及一些附加的包的獨立的目錄樹。

不同的應用程式可以使用不同的虛擬環境。為了解決前面例子中的衝突,應用程式 A 可以有自己的虛擬環境,其中安裝了特定模組的 1。0 版本。而應用程式 B 擁有另外一個安裝了特定模組 2。0 版本的虛擬環境。如果應用程式 B 需求一個庫升級到 3。0 的話,這也不會影響到應用程式 A 的環境。

12。2。 建立虛擬環境

用於建立和管理虛擬環境的指令碼叫做

pyvenv

pyvenv

通常會安裝你可用的 Python 中最新的版本。這個指令碼也能指定安裝一個特定的版本的 Python,因此如果在你的系統中有多個版本的 Python 的話,你可以執行 pyvenv-3。5 或者你想要的任何版本來選擇一個指定的 Python 版本。

要建立一個 virtualenv,首先決定一個你想要存放的目錄接著執行

pyvenv

後面攜帶著目錄名:

python3 -m venv tutorial-env

如果目錄不存在的話,這將會建立一個 tutorial-env 目錄,並且也在目錄裡面建立一個包含 Python 直譯器,標準庫,以及各種配套檔案的 Python “副本”。

一旦你已經建立了一個虛擬環境,你必須啟用它。

在 Windows 上,執行:

tutorial-env\Scripts\activate。bat

在 Unix 或者 MacOS 上,執行:

source tutorial-env/bin/activate

(這個指令碼是用 bash shell 編寫的。如果你使用

csh

或者

fish

shell,你應該使用 activate。csh 和 activate。fish 來替代。)

激活了虛擬環境會改變你的 shell 提示符,顯示你正在使用的虛擬環境,並且修改了環境以致執行 python 將會讓你得到了特定的 Python 版本。例如:

$ source ~/envs/tutorial-env/bin/activate(tutorial-env) $ pythonPython 3。5。1 (default, May 6 2016, 10:59:36) 。。。>>> import sys>>> sys。path[‘’, ‘/usr/local/lib/python35。zip’, 。。。,‘~/envs/tutorial-env/lib/python3。5/site-packages’]>>>

12。3。 用 pip 來管理包檔案

你可以用

pip

來安裝、升級和刪除你的包檔案。預設情況下 pip 會從 Python Package Index 來裝所需要的包檔案, 。 你可以在你的瀏覽器中檢視 Python Package Index 的所有包檔案,或者用 pip 的搜尋功能,例如:

(tutorial-env) $ pip search astronomyskyfield - Elegant astronomy for Pythongary - Galactic astronomy and gravitational dynamics。novas - The United States Naval Observatory NOVAS astronomy libraryastroobs - Provides astronomy ephemeris to plan telescope observationsPyAstronomy - A collection of astronomy related tools for Python。。。。

pip 有許多的子命令,比如: “search”,“install”, “uninstall”, “freeze” 等等。 (你可以在 安裝 Python 模組 檢視完整的 pip 文件。)

你可以透過指定包的名稱,來按照最新的版本:

(tutorial-env) $ pip install novasCollecting novas Downloading novas-3。1。1。3。tar。gz (136kB)Installing collected packages: novas Running setup。py install for novasSuccessfully installed novas-3。1。1。3

還可以透過給包名後面加上 == 和版本號來安裝特定版本:

(tutorial-env) $ pip install requests==2。6。0Collecting requests==2。6。0 Using cached requests-2。6。0-py2。py3-none-any。whlInstalling collected packages: requestsSuccessfully installed requests-2。6。0

如果你重複輸入上面的命令, pip 會自動識別該版本已經安裝並不會再次安裝。 你可以輸入不同版本號來安裝指定版本,或者輸入 pip install ——upgrade 命令來獲取最新的版本:

(tutorial-env) $ pip install ——upgrade requestsCollecting requestsInstalling collected packages: requests Found existing installation: requests 2。6。0 Uninstalling requests-2。6。0: Successfully uninstalled requests-2。6。0Successfully installed requests-2。7。0

透過輸入 pip uninstall 後面加上一個或多個包的名字 ,從虛擬環境中移除指定的包。

透過 pip show 命令可以檢視指定包的資訊:

(tutorial-env) $ pip show requests——-Metadata-Version: 2。0Name: requestsVersion: 2。7。0Summary: Python HTTP for Humans。Home-page: http://python-requests。orgAuthor: Kenneth ReitzAuthor-email: me@kennethreitz。comLicense: Apache 2。0Location: /Users/akuchling/envs/tutorial-env/lib/python3。4/site-packagesRequires:

pip list 命令可以顯示虛擬環境中已經安裝的所有包檔案:

(tutorial-env) $ pip listnovas (3。1。1。3)numpy (1。9。2)pip (7。0。3)requests (2。7。0)setuptools (16。0)

pip freeze 命令會生成一個已經按照的包的列表, 輸出格式是 pip install 命令所期望的那樣。 通常情況下,會把輸出的包列表放到一個 requirements。txt 檔案裡:

(tutorial-env) $ pip freeze > requirements。txt(tutorial-env) $ cat requirements。txtnovas==3。1。1。3numpy==1。9。2requests==2。7。0

requirements。txt 檔案可以作為版本控制,並且成為應用程式的一部分。使用者也可以透過 install -r 命令來按照所有需要的包檔案:

(tutorial-env) $ pip install -r requirements。txtCollecting novas==3。1。1。3 (from -r requirements。txt (line 1)) 。。。Collecting numpy==1。9。2 (from -r requirements。txt (line 2)) 。。。Collecting requests==2。7。0 (from -r requirements。txt (line 3)) 。。。Installing collected packages: novas, numpy, requests Running setup。py install for novasSuccessfully installed novas-3。1。1。3 numpy-1。9。2 requests-2。7。0

pip 還有更多的功能。你可以在安裝 Python 模組查閱 pip 的完整手冊。 如果你想把自己寫的包檔案能在 Python Package Index 上被大家看到,請參考文件 分發 Python 模組。