Найти в Дзене
JEasy

Как создать и использовать виртуальное окружение Python

Разбираемся с виртуальным окружением для интерпретатора Python. Учимся создавать, активировать, деактивировать, клонировать и удалять виртуальные среды вручную и с помощью алиасов bash. Виртуальное окружение python - это механизм организации изолированных сред Python. Разработчик создает для проекта автономную директорию-среду с подходящей версией интерпретатора Python, зависимостями ядра и нужными сторонними пакетами. Такой подход уменьшает риск поломок в основной системе и позволяет работать с пакетами разных версий без конфликтов. Также виртуальные среды просто клонировать при переносе софта в другое место, например, на боевой сервер. Но виртуальное окружение занимает дополнительное место на накопителях. Для примера, python окружение небольшого сайта на Django занимает 120-150 мегабайт. А если работаем с библиотеками для NLP, то размер виртуальной среды вырастет до 500-1000 мегабайт и даже больше. Виртуальные среды Python обеспечивают эффективный способ управления множеством библио
Оглавление

Разбираемся с виртуальным окружением для интерпретатора Python. Учимся создавать, активировать, деактивировать, клонировать и удалять виртуальные среды вручную и с помощью алиасов bash.

Виртуальное окружение python - это механизм организации изолированных сред Python. Разработчик создает для проекта автономную директорию-среду с подходящей версией интерпретатора Python, зависимостями ядра и нужными сторонними пакетами. Такой подход уменьшает риск поломок в основной системе и позволяет работать с пакетами разных версий без конфликтов. Также виртуальные среды просто клонировать при переносе софта в другое место, например, на боевой сервер.

Но виртуальное окружение занимает дополнительное место на накопителях. Для примера, python окружение небольшого сайта на Django занимает 120-150 мегабайт. А если работаем с библиотеками для NLP, то размер виртуальной среды вырастет до 500-1000 мегабайт и даже больше.

Виртуальные среды Python обеспечивают эффективный способ управления множеством библиотек и пакетов, обеспечивая согласованность приложений.

Как создать виртуальное окружение python

Для создания виртуального окружения python применяем команду

$ python -m venv env

Эта команда создает директорию env, внутри которой организует структуру новой изолированной среды python. Теперь в env/bin лежат исполняемые файлы activate, pip, easy_install и символические ссылки на системные интерпретаторы python. В директории env/lib/python*/site-packages размещаются зависимости и сторонние пакеты.

-2

Модуль venv поддерживает опции.

--prompt задает приглашение, которое отображается в консоли при активной виртуальной среде. Для примера python -m venv --prompt django env.

--clear удаляет содержимое директории виртуального окружения перед установкой новой среды. Для примера python -m venv --clear env.

--upgrade обновляет виртуальное окружение для использования с новой или другой версией python. Опцию применяют после изменения системного интерпретатора python. Для примера python -m venv --upgrade env.

--upgrade-deps обновляет pip и setuptools в виртуальном окружении. Для примера python -m venv --upgrade-deps env.

Остальные опции доступны по команде python -m venv --help

Как активировать виртуальное окружение

В директории env/bin лежат скрипты активации виртуального окружения.

В Unix и MacOS в терминале bash виртуальную среду python активируют командой

$ source ./env/bin/activate

Для упрощения вместо команды source используют точку:

$ . ./env/bin/activate

Для оболочек csh и fish используют скрипты env/bin/activate.csh и env/bin/activate.fish соответственно.

В Windows виртуальную среду python активируют так:

env\Scripts\activate.bat

Как деактивировать виртуальную среду

Скрипт активации виртуального окружения создает функцию deactivate, которую можно вызвать для деактивации среды в оболочке.

$ deactivate

После деактивации python будет работать в системном окружении.

Как удалить виртуальное окружение

Для удаления среды просто удаляют директорию с ней. Но сначала активное окружение деактивируют.

(env)$ deactivate
$ rm -r env

Как клонировать виртуальное окружение python

В активированном виртуальном окружении, которое нужно клонировать, создают файл со списком всех пакетов и деактивируют среду. Далее этот файл используют для установки пакетов в новой виртуальной среде.

(old-env)$ pip freeze > requirements.txt
...
(new-env)$ pip install -r requirements.txt

Алиасы для управления виртуальным окружением

Для комфортной работы с виртуальными средами python часто используют virtualenvwrapper. Он создает все директории виртуальных окружений в одном месте и предоставляет удобные команды для создания, активации и деактивации сред.

Но иногда используют самописные решения. Я работаю с оболочкой bash под Debian и использую 4 алиаса: cenv, venv, denv, rmenv. Эти команды работают с виртуальным окружением в текущей или в общей директории ~/.venvs

Также использую эти 4 алиаса на серверах для деплоя Django, Flask и других python приложений. Мне удобно и решение работает без лишних пакетов в системе.

Алиас cenv - create env

Команда cenv создает виртуальное окружение python env в текущей директории или, если указать параметр, в ~/.venvs.

alias cenv='__a(){ [[ -n $1 ]] && A="$HOME/.venvs/$1" || A="."; [[ -d $A/env ]] && echo "env exists" || (mkdir -p $A; python3 -mvenv --upgrade-deps $A/env > /dev/null && echo "$A/env created"); unset -v A; unset -f __a; }; __a'

Алиас venv - virtual env

Команда venv активирует виртуальное окружение python env в текущей директории или, если указать параметр, в ~/.venvs.

alias venv='__a(){ [[ -n $1 ]] && A="$HOME/.venvs/$1/env/" || A="./env"; [[ -f $A/bin/activate ]] && source $A/bin/activate && echo "$A activated" || echo "$A not exists" ; unset $A; unset -v A; unset -f __a; }; __a'

Алиас denv - deactivate env

Команда denv деактивирует виртуальное окружение python.

alias denv='[[ "$(type -t deactivate)" == "function" ]] && deactivate'

Алиас rmenv - remove env

Команда rmenv удаляет директорию с виртуальным окружением env в текущем каталоге или в ~/.venvs

alias rmenv='__a(){ [[ -n $1 ]] && A="$HOME/.venvs/$1" || A="./env"; [[ "$(type -t deactivate)" == "function" ]] && deactivate; [[ -d $A ]] && rm -r $A && echo "$A removed"; unset -v A; unset -f __a; }; __a'

Как использовать эти алиасы

В оболочке bash предусмотрели специальный файл ~/.bash_aliases для пользовательских команд-псевдонимов. Алиасы можно добавить туда. Но можно прописать и в другие стартовые сценарии оболочки.

alias cenv='__a(){ [[ -n $1 ]] && A="$HOME/.venvs/$1" || A="."; [[ -d $A/env ]] && echo "env exists" || (mkdir -p $A; python3 -mvenv --upgrade-deps $A/env > /dev/null && echo "$A/env created"); unset -v A; unset -f __a; }; __a'
alias venv='__a(){ [[ -n $1 ]] && A="$HOME/.venvs/$1/env/" || A="./env"; [[ -f $A/bin/activate ]] && source $A/bin/activate && echo "$A activated" || echo "$A not exists" ; unset $A; unset -v A; unset -f __a; }; __a'
alias denv='[[ "$(type -t deactivate)" == "function" ]] && deactivate'
alias rmenv='__a(){ [[ -n $1 ]] && A="$HOME/.venvs/$1" || A="./env"; [[ "$(type -t deactivate)" == "function" ]] && deactivate; [[ -d $A ]] && rm -r $A && echo "$A removed"; unset -v A; unset -f __a; }; __a'

Запускаем файл ~/.bash_aliases

$ source ~/.bash_aliases

Теперь можно применять новые команды для быстрой работы с виртуальным окружением python.