
Программируя в 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
В результате файл будет выглядеть следующим образом:
Чтобы изменения вступили в силу, выполните команду 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:~$
Теперь можно не переживать за конфликты версий пакетов между разными проектами и наслаждаться использованием виртуального окружения.