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, с которой была запущена команда (о чем сообщает опция --version). Например, выполнение команды с python3.12 установит версию 3.12.

Чтобы создать виртуальную среду, определитесь с каталогом, в котором вы хотите ее разместить, и запустите модуль venv как скрипт с указанием пути к каталогу:

python -m venv tutorial-env

Это создаст каталог tutorial-env, если он не существует, а также создаст внутри него каталоги, содержащие копию интерпретатора Python и различные вспомогательные файлы.

Обычное местоположение каталога для виртуальной среды - .venv. Это имя позволяет сохранить каталог, обычно скрытый в оболочке и, таким образом, не мешающий работе, а также дать ему имя, объясняющее, почему каталог существует. Это также предотвращает столкновение с файлами определения переменных окружения .env, которые поддерживаются некоторыми инструментами.

После создания виртуальной среды ее можно активировать.

В Windows выполните:

tutorial-env\Scripts\activate

В 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']
>>>

Чтобы деактивировать виртуальную среду, введите:

deactivate

в терминал.

12.3. Управление пакетами с помощью pip

Вы можете устанавливать, обновлять и удалять пакеты с помощью программы pip. По умолчанию pip устанавливает пакеты из Python Package Index. Вы можете просмотреть индекс пакетов Python, перейдя на него в веб-браузере.

У pip есть несколько подкоманд: «установить», «удалить», «заморозить» и т. д. (полную документацию по Установка модулей 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 packaging user guide.