В unix-системе питоновские пакеты совсем не обязательно нужно ставить в системные каталоги (в /usr/, например). Благодаря virtualenv, пакеты можно установить в любой каталог, инициализировать локально окружение в терминале через специальный скрипт и дальше пользоваться всеми установленными в том каталоге библиотеками и программами. Локальный набор пакетов очень удобен для разработчика, так как позволяет на одной системе переключаться между разными их версиями.
В статье я описываю не только концепт, но и всю процедуру подготовки локального окружения. Сразу же уточнение: всё работает только в терминале, то есть вы запускаете терминал, «активируете» в нём нужный каталог с пакетами и дальше в этом терминале работаете. Базовая операционная система — linux, *bsd или mac os x. Windows я не рассматриваю.
Итак, нам понадобится установленный системно python3. Для линукса он ставится из пакетов вашего репозитория, для макоси — скачивается с офсайта https://www.python.org/downloads/mac-osx/ или через brew. В принципе, можно пользоваться штатной версией из макоси, но она гарантированно не будет последней. Например, в Macos Sonoma 14.5 штатно установлен python3 версии 3.9.6, хотя через brew уже доступна 3.12.3 (июнь 2024 года).
Локальный каталог, куда мы всё будем ставить, — ~/.local-pyvenv
, я его делаю скрытым (имя начинается с точки), так как он нам в явном виде практически никогда не понадобится, плюс мешаться в списке файлов не будет.
Для начала удалим этот каталог на всякий случай, если он существует.
[user@shell]$ rm -rf ~/.local-pyvenv
Дальше нам нужно установить virtualenv. В случае ubuntu/debian это можно сделать командой apt install virtualenv
, для макоси пакет virtualenv уже должен быть установлен и доступен.
Инициализируем каталог с виртуальным окружением:
[user@shell]$ python3 -m venv ~/.local-pyvenv
Теперь у нас есть готовое локальное окружение с «установленным» питоном, перед началом использования его нужно «активировать». Активация по сути переписывает переменные окружения типа $PATH и добавляет туда пути из ~/.local-pyvenv
с более высоким приоритетом, чем системный. Вот как это делается:
[user@shell]$ source ~/.local-pyvenv/bin/activate
(.local-pyvenv) [user@shell]$
Обратите внимание, в приглашении терминала появилась новая строка (.local-pyvenv)
, она вам всегда будет напоминать, что вы находитесь в «активированном» окружении и часть программ и библиотек теперь будет в первую очередь искаться в каталоге .local-pyvenv
, а не в системных. Чтобы убедиться в этом, запустите такой код:
[user@shell]$ which python3
/Users/sigsergv/.local-pyvenv/bin/python3
В активированном окружении теперь можно ставить пакеты и программы через pip3 и они все будут ставиться не в системные каталоги, а в ~/.local-pyvenv
. При этом вы можете свободно находиться в любом каталоге, а не в ~/.local-pyvenv
.
В дальнейшем сценарий работы такой:
- Запускаем новую сессию в терминале
- Активируем рабочее окружение командой
source ~/.local-pyvenv/bin/activate
- Работаем как обычно
«Деактивировать» окружение можно из текущей сессии командой deactivate
, она возвращает все изменённые переменные окружения на место.