Виртуальное окружение
О важности виртуального окружения
Эту тему важно понять, пока мы не приступили к серьёзной работе с Python.
Python - это востребованный системой интерпретатор. В случае, если какая-то программа написанная на Python устанавливается в систему, то подгужаются также и пакеты, которые она использует. Ведя разработку, мы вынуждены каким-либо образом манипулировать пакетами в достаточно широком диапазоне допустимых (и не очень) вещей. Поэтому мы рискуем повредить, удалить или обновить/откатить произвольный пакет до версии, которая будет несовместима с утилитами нашей операционки и она будет функционировать не так как мы хотим. Чтобы всего этого не происходило, создаются виртуальные окружения (Virtual environment).
Как это сделать?
Отдельно рассмотрим вариант создания venv в PyCharm, сейчас же посмотрим, как сделать это руками.
- Во-первых, проверяем, установлен ли у нас глобально пакет python3-venv (Linux). Можно сделать это так:
sudo dpkg -s python3-venv | grep Status | awk '{print $3}'
Если "ok", то ok, если нет, то устанавливаем:
sudo apt install python3-venv
- Заходим в папку проекта и создаём папку, куда будет устанавливаться наше окружение
python3 -m venv venv
Здесь мы говорим интерпретатору (python3
) используя модуль (-m
) venv (первое слово venv
), создать папку venv (второе слово venv
). Имя папки не так важно.
- Активируем виртуальное окружение
source venv/bin/activate
Если всё сделали правильно, то перед текстом приглашения к вводу появится название папки с виртуальным окружением в скобках.
- Чтобы проконтролировать, можно проверить, на что ссылается команда python3, которую мы собираемся исполнять в данной дирректории
which python
- Для выхода вводим команду deactivate или выходим из терминала.
О фиксации пакетов
Чтобы в другом месте быстро развернуть проект в том же состоянии, создают файл-манифест со списком пакетов. После вводят команду pip install -r <manifest.txt>
и работают с проектом на новом месте.
Способ раз: простейший
Традиционно, файл манифеста в Python называют reqiremrnts.txt, последуем и мы этой традиции. По-сути, нужно всего-то ввести команду
pip freeze > requirements.txt
Первая часть - это использование утилиты freeze, которая делает список установленных пакетов и выводит его в stdout. Мы же перехватываем этот вывод и создаём наш файлик. В нём каждая строчка выглядит примерно так:
pytest==7.1.3
Эта, например, говорит о том, что мы установили пакет pytest и он точно версии 7.1.3 . Есть возможность указать версии выше определённой, ниже, послежней, последней стабильной и т. д. Позднее всё это распишем, пока не суть.
Однако, большим недостатком данного метода является гигантское количество пакетов в манифесте, которое делает нашу работу совершенно непрозрачной. Поэтому существует способ два.
Способ два: симпатишный
Так как большинство пакетов устанавливается в наше окружение в неявном виде (в качестве зависимостей), то и необходимость в дотошном их перечислении отсутствует.
Поэтому мы можем или создать файлик requirements.txt описанным выше способом и из него удалить все нецелевые пакеты, или создать манифест вручную, а потом добавлять пакеты в него и постоянно делать
pip install -r reqirements.txt
К тому же мы возможно, захотим обновить какой-либо из наших пакетов. В случае, если у нас короткий список со всем нужным и без всего ненужного, то нам достаточно поменять номер версии и запустить pip install -r .... Пакетник автоматически установит требуемую версию, а старую удалит.