12. 虛擬環境和包¶
12.1. 簡介¶
Python 應用程式通常會使用不屬於標準庫的包和模組。應用程式有時需要特定版本的庫,因為應用程式可能要求修復特定的錯誤,或者應用程式可能使用該庫的過時介面編寫。
這意味著一個 Python 安裝可能無法滿足每個應用程式的要求。如果應用程式 A 需要特定模組的 1.0 版本,而應用程式 B 需要 2.0 版本,則需求會發生衝突,安裝 1.0 或 2.0 版本都會導致一個應用程式無法執行。
解決此問題的方法是建立一個 虛擬環境,這是一個自包含的目錄樹,其中包含特定 Python 版本的 Python 安裝以及許多額外的包。
不同的應用程式隨後可以使用不同的虛擬環境。為了解決前面衝突需求的示例,應用程式 A 可以有自己的虛擬環境,安裝 1.0 版本,而應用程式 B 則有另一個虛擬環境,安裝 2.0 版本。如果應用程式 B 需要將庫升級到 3.0 版本,這不會影響應用程式 A 的環境。
12.2. 建立虛擬環境¶
用於建立和管理虛擬環境的模組稱為 venv
。 venv
將安裝執行該命令的 Python 版本(由 --version
選項報告)。例如,使用 python3.12
執行該命令將安裝 3.12 版本。
要建立虛擬環境,請確定要放置它的目錄,並使用目錄路徑作為指令碼執行 venv
模組
python -m venv tutorial-env
如果 tutorial-env
目錄不存在,這將建立該目錄,並且還會在其中建立包含 Python 直譯器副本和各種支援檔案的目錄。
虛擬環境的常見目錄位置是 .venv
。此名稱通常使該目錄在您的 shell 中保持隱藏狀態,因此不會妨礙使用,同時為其指定一個解釋該目錄存在原因的名稱。它還可以防止與某些工具支援的 .env
環境變數定義檔案發生衝突。
建立虛擬環境後,您可以啟用它。
在 Windows 上,執行
tutorial-env\Scripts\activate
在 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) $ python
Python 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']
>>>
要停用虛擬環境,請在終端中鍵入
deactivate
到終端中。
12.3. 使用 pip 管理包¶
您可以使用名為 pip 的程式來安裝、升級和刪除包。預設情況下,pip
將從 Python 包索引安裝包。您可以在 Web 瀏覽器中訪問 Python 包索引來瀏覽它。
pip
有許多子命令:“install”、“uninstall”、“freeze” 等。(請參閱 安裝 Python 模組指南,以獲取 pip
的完整文件。)
您可以透過指定包的名稱來安裝最新版本的包
(tutorial-env) $ python -m pip install novas
Collecting novas
Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
Running setup.py install for novas
Successfully installed novas-3.1.1.3
您還可以透過指定包名稱,後跟 ==
和版本號來安裝特定版本的包
(tutorial-env) $ python -m pip install requests==2.6.0
Collecting requests==2.6.0
Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0
如果您重新執行此命令,pip
將注意到已安裝請求的版本,因此不會執行任何操作。您可以提供不同的版本號來獲取該版本,或者您可以執行 python -m pip install --upgrade
將包升級到最新版本
(tutorial-env) $ python -m pip install --upgrade requests
Collecting requests
Installing collected packages: requests
Found existing installation: requests 2.6.0
Uninstalling requests-2.6.0:
Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
python -m pip uninstall
後跟一個或多個包名稱將從虛擬環境中刪除這些包。
python -m pip show
將顯示有關特定包的資訊
(tutorial-env) $ python -m pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
python -m pip list
將顯示虛擬環境中安裝的所有包
(tutorial-env) $ python -m pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
python -m pip freeze
將生成已安裝包的類似列表,但輸出使用 python -m pip install
期望的格式。常見的約定是將此列表放在 requirements.txt
檔案中
(tutorial-env) $ python -m pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
然後可以將 requirements.txt
提交到版本控制中,並作為應用程式的一部分進行交付。使用者隨後可以使用 install -r
安裝所有必要的包
(tutorial-env) $ python -m pip install -r requirements.txt
Collecting 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 novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
pip
還有許多其他選項。請參閱 安裝 Python 模組指南,以獲取 pip
的完整文件。當您編寫了一個包並希望使其在 Python 包索引上可用時,請參閱 Python 打包使用者指南。