Как настроить виртуальное окружение virtualenv для Python3 (Ubuntu)

Превью к инструкции по установке виртуального окружения

Программируя в Python (да и в любом другом языке с установочными пакетами) в определённый момент функциональности стандартной библиотеки становится недостаточно и приходится прибегать к установке сторонних пакетов-библиотек. В Python для этого используется менеджер установки пакетов pip (для Python3 соответственно pip3). Пока проект всего один, всё идёт хорошо, однако в какой-то момент оказывается, что в другом проекте нужен такой же пакет, как уже есть, только другой версии. Такое случается, когда библиотеки активно развиваются и в какой-то момент перестают поддерживать обратную совместимость. В таком случае, можно удалить текущую версию и поставить ту, в которой всё работает. Увы, такое случается довольно редко. В реальности скорее всего необходимо иметь две разных версии одного пакета одновременно. Что же делать?

Виртуальное окружение virtualenv

Для решения конфликта версий был придуман механизм виртуальных окружений (virtual environments). С его помощью можно создать виртуальную среду, в которую можно устанавливать пакеты независимо от основной среды или других виртуальных окружений. Для простоты можно считать, что venv создаёт внутри проекта каталог, в который добавляет нужную версию Python и устанавливает все используемые пакеты для приложения. В результате получается рабочее, изолированное и переносимое окружение. Звучит удобно, давайте скорее его ставить!

Шаг 0. Проверяем наличие Python3

Чтобы проверить, установлен ли Python3 на Вашей системе, выполните следующую команду:

python3 --version

Если нужная версия питона установлена, то вывод команды будет примерно таким:

andrew@andrew-VirtualBox:~$ python3 --version
Python 3.6.9
andrew@andrew-VirtualBox:~$

Если Python3 отсутствует в системе, то установите его, выполнив следующую команду:

sudo apt install python3

Шаг 1. Устанавливаем менеджер пакетов pip (если ещё не установлен)

Чтобы иметь возможность устанавливать пакеты в Python, необходимо установить пакетный менеджер pip. Делается это с помощью следующей команды:

sudo apt install python3-pip

Шаг 2. Устанавливаем пакет виртуального окружения virtualenv

С помощью только что установленного менеджера пакетов ставим пакет virtualenv:

sudo pip3 install virtualenv

Шаг 3. Создаём каталог для хранения виртуальных файлов

Удобнее всего хранить все виртуальные окружения в одном месте. В нашем случае мы будем хранить их в папке ~/.virtualenvs, которую предварительно создадим с помощью команды:

mkdir ~/.virtualenvs

Строго говоря, на этом этапе уже можно использовать virtualenv со стандартными командами. Однако удобнее использовать дополнительные команды из virtualenvwrapper, чтобы не настраивать всё самостоятельно.

Шаг 4. Устанавливаем virtualenvwrapper

virtualenvwrapper - такой же пакет, как и virtualenv, а потому для его установки будем использовать pip:

sudo pip3 install virtualenvwrapper

Шаг 5. Настройка переменных окружения и ~/.bashrc

Создайте переменную окружения WORKON_HOME с путём к созданной папке с виртуальными окружениями:

export WORKON_HOME=~/.virtualenvs

Допишите следующий текст в файл ~/.bashrc:

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.6
. /usr/local/bin/virtualenvwrapper.sh

Чтобы отредактировать файл ~/.bashrc, можно использовать простой текстовый редактор nano:

nano ~/.bashrc

В результате файл будет выглядеть следующим образом:

Дописываем файл ~/.bashrc
Дописываем файл ~/.bashrc

Чтобы изменения вступили в силу, выполните команду source:

source ~/.bashrc

Если всё сделано правильно, скрипты virtualenvwrapper'а настроят файлы и каталоги, а в терминале будет следующее:

andrew@andrew-VirtualBox:~$ export WORKON_HOME=~/.virtualenvs
andrew@andrew-VirtualBox:~$ nano ~/.bashrc
andrew@andrew-VirtualBox:~$ source ~/.bashrc
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/premkproject
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/postmkproject
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/initialize
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/premkvirtualenv
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/postmkvirtualenv
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/prermvirtualenv
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/postrmvirtualenv
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/predeactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/postdeactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/preactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/postactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/get_env_details
andrew@andrew-VirtualBox:-$

Всё готово, можно создавать виртуальное окружение!

Шаг 6. Создаём виртуальное окружение

Чтобы создать виртуальное окружение, достаточно всего лишь выполнить команду mkvirtualenv и задать имя этого окружения, например, так:

mkvirtualenv my_virtualenv

Результатом команды будет созданное виртуальное окружение и в самом начале строки терминала в скобках появится имя только что созданного окружения:

andrew@andrew-VirtualBox:~$ mkvirtualenv my_virtualenv
created virtual environment CPython3.6.9.final.0-64 in 724ms
    creator CPython3Posix(dest=/home/andrew/.virtualenvs/my_virtualenv, clear=False, no_vcs_ignore=False, global=False)
    seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/andrew/.local/share/virtualenv)
      added seed packages: pip==20.3.3, setuptools==51.3.3, wheel==0.36.2
    activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv/bin/preactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv/bin/postactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv/bin/get_env_details
(my_virtualenv) andrew@andrew-VirtualBox:~$ python --version
Python 3.6.9
(my_virtualenv) andrew@andrew-VirtualBox:~$

Чтобы вернуться в обычное окружение (выйти из виртуального окружения), используется команда deactivate:

(my_virtualenv)andrew@andrew-VirtualBox:~$ deactivate
andrew@andrew-VirtualBox:~$

А чтобы активировать виртуальное окружение, используется команда workon [имя_окружения]:

andrew@andrew-VirtualBox:~$ workon my_virtualenv
(my_virtualenv) andrew@andrew-VirtualBox:~$

Создание виртуального окружения с другой версией Python3

Может возникнуть ситуация, при которой одному проекту будет нужна версия Python 3.6, а другому 3.5, а какому-то и вовсе 3.8. Неужели придётся настраивать виртуальные окружения с нуля для каждой версии по-отдельности?

К счастью, нет. При создании нового виртуального окружения, достаточно указать версию Python (важно: эта версия должна быть установлена в системе) после флага --python:

andrew@andrew-VirtualBox:~$ mkvirtualenv my_virtualenv_p3.5 --python=python3.5

Если указанная версия Python установлена в системе, то вывод терминала должен будет быть похож на этот, а результат команды python --version должен выдать указанную при создании версию языка.

andrew@andrew-VirtualBox:~$ python3.5 --version
Python 3.5.10
andrew@andrew-VirtualBox:~$ mkvirtualenv my_virtualenv_p3.5 --python=python3.5
created virtual environment CPython3.5.10.final.0-64 in 147ms
    creator CPython3Posix(dest=/home/andrew/.virtualenvs/my_virtualenv_p3.5, clear=False, no_vcs_ignore=False, global=False)
    seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/andrew/.local/share/virtualenv)
      added seed packages: pip==20.3.3, setuptools==50.3.2, wheel==0.36.2
    activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv_p3.5/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv_p3.5/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv_p3.5/bin/preactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv_p3.5/bin/postactivate
virtualenvwrapper.user_scripts creating /home/andrew/.virtualenvs/my_virtualenv_p3.5/bin/get_env_details
(my_virtualenv_p3.5) andrew@andrew-VirtualBox:~$ python --version
Python 3.5.10
(my_virtualenv_p3.5) andrew@andrew-VirtualBox:~$

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