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.