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 в виде сценария с указанием пути к каталогу:

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

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

deactivate

в терминал.

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

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

pip имеет ряд подкоманд: «установить», «удалить», «заморозить» и т.д. (Полную документацию для pip смотрите в руководстве Установка модулей Python.)

Вы можете установить последнюю версию пакета, указав его имя:

(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.

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