12. Виртуальные среды и пакеты

12.1. Введение

Приложения Python часто используют пакеты и модули, которые не входят в стандартную библиотеку. Иногда приложениям требуется определенная версия библиотеки, потому что приложение может требовать исправления определенной ошибки или приложение может быть написано с использованием устаревшей версии интерфейса библиотеки.

Это означает, что одна установка Python не может удовлетворить требования всех приложений. Если приложению A нужна версия 1.0 определенного модуля, а приложению B нужна версия 2.0, то требования противоречат друг другу, и установка версии 1.0 или 2.0 приведет к тому, что одно приложение не сможет работать.

Решением этой проблемы является создание virtual environment, самодостаточного дерева каталогов, которое содержит установку Python для определенной версии Python, плюс ряд дополнительных пакетов.

Различные приложения могут использовать разные виртуальные среды. Для решения предыдущего примера о противоречивых требованиях приложение A может иметь собственную виртуальную среду с установленной версией 1.0, в то время как приложение B имеет другую виртуальную среду с версией 2.0. Если приложение B требует обновления библиотеки до версии 3.0, это не повлияет на среду приложения A.

12.2. Создание виртуальных сред

Модуль, используемый для создания и управления виртуальными средами, называется venv. venv обычно устанавливает самую последнюю доступную версию Python. Если в вашей системе установлено несколько версий Python, вы можете выбрать конкретную версию Python, выполнив python3 или любую другую версию.

Чтобы создать виртуальную среду, определите каталог, в котором вы хотите ее разместить, и запустите модуль 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. Если вы используете оболочки csh или fish, существуют альтернативные сценарии 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, <https://pypi.org>. Вы можете просмотреть индекс пакетов 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 заметит, что запрашиваемая версия уже установлена, и ничего не сделает. Вы можете указать другой номер версии, чтобы получить эту версию, или выполнить 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: me@kennethreitz.com
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 имеет гораздо больше возможностей. Обратитесь к руководству Установка модулей Python для получения полной документации по pip. Если вы написали пакет и хотите сделать его доступным в Python Package Index, обратитесь к руководству Распространение модулей Python.

Вернуться на верх