虛擬環境和包
12. 虛擬環境和包
12.1. 概述
Python應用程式通常會使用不在標準庫內的軟體包和模組。應用程式有時需要特定版本的庫,因為應用程式可能需要修復特定的錯誤,或者可以使用庫的過時版本的介面編寫應用程式。
這意味著一個Python安裝可能無法滿足每個應用程式的要求。如果應用程式A需要特定模組的1.0版本但應用程式B需要2.0版本,則需求存在衝突,安裝版本1.0或2.0將導致某一個應用程式無法執行。
這個問題的解決方案是建立一個 virtual environment,一個目錄樹,其中安裝有特定Python版本,以及許多其他包。
然後,不同的應用將可以使用不同的虛擬環境。 要解決先前需求相沖突的例子,應用程式 A 可以擁有自己的 安裝了 1.0 版本的虛擬環境,而應用程式 B 則擁有安裝了 2.0 版本的另一個虛擬環境。 如果應用程式 B 要求將某個庫升級到 3.0 版本,也不會影響應用程式 A 的環境。
12.2. 建立虛擬環境
用於建立和管理虛擬環境的模組稱為 venv
。venv
通常會安裝你可用的最新版本的 Python。如果您的系統上有多個版本的 Python,您可以通過執行 python3
或您想要的任何版本來選擇特定的Python版本。
要建立虛擬環境,請確定要放置它的目錄,並將 venv
模組作為指令碼執行目錄路徑:
python3 -m venv tutorial-env
這將建立 tutorial-env
目錄,如果它不存在的話,並在其中建立包含 Python 直譯器副本和各種支援檔案的目錄。
虛擬環境的常用目錄位置是 .venv
。 這個名稱通常會令該目錄在你的終端中保持隱藏,從而避免需要對所在目錄進行額外解釋的一般名稱。 它還能防止與某些工具所支援的 .env
環境變數定義檔案發生衝突。
建立虛擬環境後,您可以啟用它。
在Windows上,執行:
tutorial-env\Scripts\activate.bat
在Unix或MacOS上,執行:
source tutorial-env/bin/activate
(這個指令碼是為bash shell編寫的。如果你使用 csh 或 fish shell,你應該改用 activate.csh
或 activate.fish
指令碼。)
啟用虛擬環境將改變你所用終端的提示符,以顯示你正在使用的虛擬環境,並修改環境以使 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']
>>>
12.3. 使用pip管理包
你可以使用一個名為 pip 的程式來安裝、升級和移除軟體包。 預設情況下 pip
將從 Python Package Index <https://pypi.org> 安裝軟體包。 你可以在你的 web 瀏覽器中檢視 Python Package Index。
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
會注意到已經安裝了所請求的版本並且什麼都不做。您可以提供不同的版本號來獲取該版本,或者您可以執行 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
pip uninstall
後跟一個或多個包名稱將從虛擬環境中刪除包。
pip show
將顯示有關特定包的資訊:
(tutorial-env) $ 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: [email protected]
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
pip list
將顯示虛擬環境中安裝的所有軟體包:
(tutorial-env) $ pip list
novas (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.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
有更多選擇。有關 pip
的完整文件,請參閱 安裝 Python 模組 指南。當您編寫一個包並希望在 Python 包索引中使它可用時,請參考 分發 Python 模組 指南。
目錄
上一個主題
下一個主題
本頁
« © 版權所有 2001-2022, Python Software Foundation.This page is licensed under the Python Software Foundation License Version 2.
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
See History and License for more information.
The Python Software Foundation is a non-profit corporation. Please donate.
最後更新於 5月 10, 2022. Found a bug?
Created using Sphinx 3.2.1. "