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.