12. 虛擬環(huán)境和包?

12.1. 概述?

Python應(yīng)用程序通常會(huì)使用不在標(biāo)準(zhǔn)庫(kù)內(nèi)的軟件包和模塊。應(yīng)用程序有時(shí)需要特定版本的庫(kù),因?yàn)閼?yīng)用程序可能需要修復(fù)特定的錯(cuò)誤,或者可以使用庫(kù)的過(guò)時(shí)版本的接口編寫(xiě)應(yīng)用程序。

這意味著一個(gè)Python安裝可能無(wú)法滿(mǎn)足每個(gè)應(yīng)用程序的要求。如果應(yīng)用程序A需要特定模塊的1.0版本但應(yīng)用程序B需要2.0版本,則需求存在沖突,安裝版本1.0或2.0將導(dǎo)致某一個(gè)應(yīng)用程序無(wú)法運(yùn)行。

這個(gè)問(wèn)題的解決方案是創(chuàng)建一個(gè) virtual environment,一個(gè)目錄樹(shù),其中安裝有特定Python版本,以及許多其他包。

然后,不同的應(yīng)用將可以使用不同的虛擬環(huán)境。 要解決先前需求相沖突的例子,應(yīng)用程序 A 可以擁有自己的 安裝了 1.0 版本的虛擬環(huán)境,而應(yīng)用程序 B 則擁有安裝了 2.0 版本的另一個(gè)虛擬環(huán)境。 如果應(yīng)用程序 B 要求將某個(gè)庫(kù)升級(jí)到 3.0 版本,也不會(huì)影響應(yīng)用程序 A 的環(huán)境。

12.2. 創(chuàng)建虛擬環(huán)境?

用于創(chuàng)建和管理虛擬環(huán)境的模塊稱(chēng)為 venv。venv 通常會(huì)安裝你可用的最新版本的 Python。如果您的系統(tǒng)上有多個(gè)版本的 Python,您可以通過(guò)運(yùn)行 python3 或您想要的任何版本來(lái)選擇特定的Python版本。

要?jiǎng)?chuàng)建虛擬環(huán)境,請(qǐng)確定要放置它的目錄,并將 venv 模塊作為腳本運(yùn)行目錄路徑:

python3 -m venv tutorial-env

這將創(chuàng)建 tutorial-env 目錄,如果它不存在的話(huà),并在其中創(chuàng)建包含 Python 解釋器副本和各種支持文件的目錄。

虛擬環(huán)境的常用目錄位置是 .venv。 這個(gè)名稱(chēng)通常會(huì)令該目錄在你的終端中保持隱藏,從而避免需要對(duì)所在目錄進(jìn)行額外解釋的一般名稱(chēng)。 它還能防止與某些工具所支持的 .env 環(huán)境變量定義文件發(fā)生沖突。

創(chuàng)建虛擬環(huán)境后,您可以激活它。

在Windows上,運(yùn)行:

tutorial-env\Scripts\activate

在Unix或MacOS上,運(yùn)行:

source tutorial-env/bin/activate

(這個(gè)腳本是為bash shell編寫(xiě)的。如果你使用 cshfish shell,你應(yīng)該改用 activate.cshactivate.fish 腳本。)

激活虛擬環(huán)境將改變你所用終端的提示符,以顯示你正在使用的虛擬環(huán)境,并修改環(huán)境以使 python 命令所運(yùn)行的將是已安裝的特定 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']
>>>

To deactivate a virtual environment, type:

deactivate

into the terminal.

12.3. 使用pip管理包?

你可以使用一個(gè)名為 pip 的程序來(lái)安裝、升級(jí)和移除軟件包。 默認(rèn)情況下 pip 將從 Python Package Index <https://pypi.org> 安裝軟件包。 你可以在你的 web 瀏覽器中查看 Python Package Index。

pip 有許多子命令: "install", "uninstall", "freeze" 等等。 (請(qǐng)?jiān)?安裝 Python 模塊 指南頁(yè)查看完整的 pip 文檔。)

您可以通過(guò)指定包的名稱(chēng)來(lái)安裝最新版本的包:

(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

您還可以通過(guò)提供包名稱(chēng)后跟 == 和版本號(hào)來(lái)安裝特定版本的包:

(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

If you re-run this command, pip will notice that the requested version is already installed and do nothing. You can supply a different version number to get that version, or you can run python -m pip install --upgrade to upgrade the package to the latest version:

(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 followed by one or more package names will remove the packages from the virtual environment.

python -m pip show will display information about a particular package:

(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 will display all of the packages installed in the virtual environment:

(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 will produce a similar list of the installed packages, but the output uses the format that python -m pip install expects. A common convention is to put this list in a requirements.txt file:

(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 提交給版本控制并作為應(yīng)用程序的一部分提供。然后用戶(hù)可以使用 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 有更多選擇。有關(guān) pip 的完整文檔,請(qǐng)參閱 安裝 Python 模塊 指南。當(dāng)您編寫(xiě)一個(gè)包并希望在 Python 包索引中使它可用時(shí),請(qǐng)參考 分發(fā) Python 模塊 指南。