Содержание:развернуть
- Настройка виртуального окружения
-
Создание
-
Активация
-
Автоматическая активация
-
Деактивация
- Альтернативы venv
Все сторонние пакеты устанавливаются менеджером PIP глобально. Проверить это можно просто командой pip show <имя_пакета>
.
root@purplegate:~# pip3 show pytest
Name: pytest
Version: 5.3.2
Summary: pytest: simple powerful testing with Python
Home-page: https://docs.pytest.org/en/latest/
Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, ...
License: MIT license
Location: /usr/local/lib/python3.8/site-packages
Requires: more-itertools, pluggy, py, wcwidth, attrs, packaging
Required-by:
Location — путь до ваших глобальных пакетов.
В большинстве случаев, устанавливать пакеты глобально — плохая идея 🙅♂️ Почему? Рассмотрим простой пример:
Допустим у нас есть два проекта: «Project A» и «Project B». Оба проекта зависят от библиотеки Simplejson. Проблема возникает, когда для «Project A» нужна версия Simplejson 3.0.0, а для проекта «Project B» — 3.17.0. Python не может различить версии в глобальном каталоге site-packages
— в нем останется только та версия пакета, которая была установлена последней.
Решение данной проблемы — создание виртуального окружения (virtual environment).
Основная цель виртуального окружения Python — создание изолированной среды для python-проектов
Это означает, что каждый проект может иметь свои собственные зависимости, независимо от других проектов.
Настройка виртуального окружения
Один из самых популярных инструментов для создания виртуального окружения — virtualenv. Однако в данной статье мы будем рассматривать более свежий инструмент venv.
Устанавливать venv не нужно — он входит в стандартную библиотеку Python
Создание
Для создания виртуального окружения, перейдите в директорию своего проекта и выполните:
python -m venv venv
Флаг -m
указывает Python-у запустить venv
как исполняемый модуль.
venv/
— название виртуального окружения (где будут храниться ваши библиотеки).
В результате будет создан каталог venv/
содержащий копию интерпретатора Python, стандартную библиотеку и другие вспомогательные файлы.
Новые пакеты будут устанавливаться в venv/lib/python3.x/site-packages/
Активация
Чтобы начать пользоваться виртуальным окружением, необходимо его активировать:
venvScriptsactivate.bat
— для Windows;source venv/bin/activate
— для Linux и MacOS.
source
выполняет bash-скрипт без запуска дополнительного bash-процесса.
Проверить успешность активации можно по приглашению оболочки. Она будет выглядеть так:
(venv) root@purplegate:/var/test#
Также новый путь до библиотек можно увидеть выполнив команду:
python -c "import site; print(site.getsitepackages())"
Интересный факт: в виртуальном окружении вместо команды python3 и pip3, можно использовать python и pip
Автоматическая активация
В некоторых случаях, процесс активации виртуального окружения может показаться неудобным (про него можно банально забыть 🤷♀️).
На практике, для автоматической активации перед запуском скрипта, создают скрипт-обертку на bash
:
#!/usr/bin/env bash
source $BASEDIR/venv/bin/activate
python $BASEDIR/my_app.py
Теперь можно установить права на исполнение и запустить нашу обертку:
chmod +x myapp/run.sh
./myapp/run.sh
Деактивация
Закончив работу в виртуальной среде, вы можете отключить ее, выполнив консольную команду:
deactivate
Альтернативы venv
На данный момент существует несколько альтернатив для venv:
- pipenv — это pipfile, pip и virtualenv в одном флаконе;
- pyenv — простой контроль версий Питона;
- poetry — новый менеджер для управления зависимостями;
- autoenv — среды на основе каталогов;
- pew — инструмент для управления несколькими виртуальными средами, написанными на чистом Python;
- rez — интегрированная система конфигурирования, сборки и развертывания пакетов для программного обеспечения.
Стоит ли использовать виртуальное окружение в своей работе — однозначно да. Это мощный и удобный инструмент изоляции проектов друг от друга и от системы. С помощью виртуального окружения можно использовать даже разные версии Python!
Однако рекомендуем присмотреться к более продвинутым вариантам, например к pipenv или poetry.
Виртуальные среды (окружения) используются в Python 3 контроля версионности пакетов. Кроме контроля версий среды используют для использования разных интерпретаторов. Самих пакетов, которые создают виртуальные окружения много. В этой статье речь пойдет про venv, virtualenv и virtualenvwrapper.
Для чего нужно виртуальные среды?
При создании скрипта или программы вы часто используете сторонние модули (пакеты). Если в последующем потребуется перенос программы на другой компьютер, то вы можете столкнуться с двумя проблемами:
- Нужные пакеты отсутствуют на новом компьютере и придется проверять каждый файл программы для их поиска. Либо получить список установленных пакетов через «pip list» на старом компьютере, который выведет множество лишних модулей.
- Даже если количество пакетов или файлов программ маленькое, или вы его создали отдельно, то вы все равно можете столкнуться с проблемами в версиях. Пакеты могли быть обновлены, а методы и классы изменены.
Использование виртуальных сред избавляет вас от этих проблем. В таком виртуальной среде находится свой интерпретатор, свой pip и все пакеты относятся только к нему. Так же, весь проект, можно перенести как папку на другой компьютер без ошибок.
Кроме этого вы можете запускать разные версии Python в разных виртуальных средах, что сильно упрощает работу.
Установка и создания окружения с virtualenv
Самый популярный пакет, который используется для создания виртуальных сред в Python, это virtualenv. Для его установки на Windows выполните:
pip install virtualenv
Для установки на Linux системах, для Python 3, понадобится выполнить такую команду:
sudo pip3 install virtualenv
Если вы не будете использовать sudo, то в зависимости от версии ОС у вас появятся разные ошибки. В CentOS установка не выполнится вовсе, а в Ubuntu не будет добавлен путь в переменную окружения:
- PermissionError: [Errno 13] Permission denied: ‘/usr/local/lib/python3.6’
- Command ‘virtualenv’ not found, but can be installed with: sudo apt install virtualenv
Далее, вне зависимости от того используете ли вы Linux или Windows, вы можете выполнить команду получения справки:
virtualenv --help
Я использую Python 3.6, и так я создам окружение в папке projectname/venv:
virtualenv -p python3.6 project/venv
Способ выше устанавливает окружение относительно текущего пути. Если нужно установить на другом диске или каталоге, то можно использовать абсолютный путь. Так же не обязательно указывать параметр «-p» если вы используете одну версию Python. Вариант как это может быть сделано на Windows:
virtualenv D:projectvenv
Само расположение виртуального окружения рекомендуется создавать в одной папке вместе разрабатываемым приложением. Такую структуру будет легче сопровождать. Я обычно придерживаюсь такой структуры:
-projectname # Каталог проекта
--venv # Окружение
--app # Каталог с приложением
Активация и выход из окружения
Для того что бы виртуальное окружения начало работать его нужно активировать. В разных ОС это делается по-разному.
В случаях с Linux указываем полный путь до venv/bin/activate:
source project/venv/bin/activate
Для активации в Windows, в папке venvScripts есть несколько файлов:
- activate.ps1 — для активации через Powershell;
- activate.bat — для активации через CMD.
Для активации просто укажите полный путь до файла. Например:
D:projectnamevenvScriptsactivate.ps1
О том что вы находитесь в виртуальном окружении свидетельствуют следующие надписи:
Вы так же можете сравнить количество установленных пакетов внутри виртуального окружения с тем, что установлено вне:
pip list
Теперь вы можете устанавливать пакеты, которые будут работать только в этой среде.
Для выхода из окружения, за исключением запуска с помощью CMD, используйте команду:
deactivate
Для CMD нужно указать путь до файла «venvScriptsdeactivate.bat».
Управление средами через virtualenvwrapper
Если вы создаете множество виртуальных сред, например для тестирования в разных версиях Python, вы можете использовать virtualenvwrapper. Этот пакет представляет собой надстройку для virtualenv для более удобной работы и устанавливается отдельно.
Благодаря этому пакету мы сможем запускать ваши окружения так:
workon project_name
# вместо
source project_name/venv/bin/activate
Для Windows нужно установить следующий пакет:
pip install virtualenvwrapper-win
Для Linux нужно так же использовать sudo:
sudo pip3 install virtualenvwrapper
Настройки для Linux
Virtualenvwrapper хранит все окружения в одном месте. Это место определяется через переменную WORKON_HOME в Linux и по умолчанию равно директории ‘/home/пользователь/.virtualenvs’. Если вы хотите изменить это расположение — выполните команду экспорта с нужным путем:
export WORKON_HOME = /var/envs/
# Создание директории
source ~/.bashrc
mkdir -p $WORKON_HOME
Следующая команда добавит скрипты в домашний каталог для удобной работы:
source /usr/local/bin/virtualenvwrapper.sh
# Если путь отличается, то файл virtualenvwrapper.sh можно найти так
which virtualenvwrapper.sh
При выполнении предыдущей команды у меня появилась ошибка:
virtualenvwrapper.sh: There was a problem running the initialization hooks. If Python could not import the module virtualenvwrapper.hook_loader
Она исправилась добавлением переменной в env с путем до нужного интерпретатора:
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
Настройки для Windows
Все виртуальные среды, которые будут созданы, по умолчанию будут располагаться по пути «C:Users%USERNAME%Envs». Если вам нужно изменить расположение, то создайте переменную WORKON_HOME с нужной директорией:
Важный момент, в случае с Windows, команды virtualenvwrapper не будут выполняться Powershell. Команды работают только через CMD.
Основные команды
Далее мы можем использовать следующие команды (основные):
- mkvirtualenv — создание окружения;
- lsvirtualenv — отображение списка окружений;
- rmvirtualenv — удаление;
- workon — переключение между виртуальными средами;
- deactivate — выход из текущего окружения.
Так мы создадим виртуальную среду:
mkvirtualenv project_name
Так выйдем из созданной среды:
deactivate
Активация окружения:
workon django3.0
Если нужно использовать другую версию Python:
mkvirtualenv -p python2.7 project_name/venv
Получение справки:
mkvirtualenv -h
Создание виртуальных сред со встроенным пакетом Python venv
Ранее, до версии Python >= 3.6 базовая установка интерпретатора шла вместе с пакетом pyenv, но на данный момент он считается устаревшим и более не поддерживается. На его смену пришел venv. В некоторых версиях ОС (Ubuntu/Debian) может потребоваться его отдельная установка:
sudo apt install python3-venv
Проверить, то что пакет venv установлен, можно так:
python -m venv
# или
python3 -m venv
Следующая команда создаст виртуальную среду:
python -m venv C:project_nameproject_venv
# или
python3 -m venv /var/project_name/project_venv
Выбранная версия Python и стандартные библиотеки будут скопированы в указанную папку.
Активация окружения выполняется следующим образом:
# CMD
C:project_nameproject_venvScriptsactivate.bat
# Powershell
C:project_nameproject_venvScriptsActivate.ps1
# Bash
project_name/project_venv/bin/activate
Для выхода из окружения:
# CMD
C:project_nameproject_venvScriptsdeactivate.bat
# Powershell и bash
deactivate
Создание виртуального окружения в Pycharm
В некоторых IDE, например Pycharm, консоль встроенная и по умолчанию у вас будет запускаться интерпретатор выбранный в настройках. В Pycharm вы можете создать или изменить проект привязав его к определенному интерпретатору.
Виртуальную среду можно создать при создании нового проекта. Для этого нужно зайти по следующему пути:
В новом окне выбрать название проекта, место для копирования, интерпретатор и нажать кнопку создания окружения:
Для настройки окружения для старых проектов нужно зайти в настройки:
Во вкладе «Python Interpreter» будет выбор из существующих интерпретаторов (1). Либо можно создать новый (2):
Создание списка установленных пакетов Requirements.txt
Используя виртуальные окружения можно легко создавать файл, в котором будут собраны все названия и версии пакетов для определенного проекта. Этот подход используется для удобства работы, так как одной программой мы сразу установим нужные пакеты.
Так мы получим список пакетов, установленных в виртуальном окружении, в формате читаемом pip:
pip freeze
Следующим способом мы экспортируем этот список в файл Requirements.txt (способ подходит для Bash/CMD/Powershell):
pip freeze > Requirements.txt
На другом компьютере/среде мы можем этот список быстро проверить и установить отсутствующие пакеты следующей командой:
pip install -r Requirements.txt
…
Теги:
#python
#virtualenv
#venv
For those of you crazy enough to have a custom DOS prompt, venv activation may fail, depending on your %PROMPT%
environment variable content.
Say you have a DOS prompt defined as follows:
set PROMPT=$_$E[1;30;40m[$E[0;36;40m%computername% | %userdomain%%username%$E[1;30;40m] $E[0;33;40m$M$_$E[35;40m$d$s$t$h$h$h$h$h$h$_$E[1;33;40m$p$_$E[1;30;40m$g $E[0;37;40m
(btw, it shows as follows, with some fancy colors:
[W10-MY_COMPUTER | W10-MY_COMPUTERJOHNDOE]
15/09/2022 20:31
F:
> echo "Hello World"
Hello World
[W10-MY_COMPUTER | W10-MY_COMPUTERJOHNDOE]
15/09/2022 20:31
F:
>
)
Then if you try to activate a venv :
.venvScriptsactivate.bat
it may fail with a rather unclear error that states:
Path not found
without further indications.
The trick is that activate.bat
(/deactivate.bat
) scripts try to save(/restore) the %PROMPT%
variable with this syntax:
...
set _OLD_VIRTUAL_PROMPT=%PROMPT%
...
set PROMPT=(venv) %PROMPT%
...
It can be fixed with this syntax:
...
set "_OLD_VIRTUAL_PROMPT=%PROMPT%"
...
set "PROMPT=(venv) %PROMPT%"
...
now it shows:
[W10-MY_COMPUTER | W10-MY_COMPUTERJOHNDOE]
15/09/2022 20:31
F:
> venvScriptsactivate.bat
(venv)
[W10-MY_COMPUTER | W10-MY_COMPUTERJOHNDOE]
15/09/2022 20:31
F:
>
Модуль venv
обеспечивает поддержку создания «облегченных виртуальных сред«. Каждая виртуальная среда имеет свой собственный двоичный файл Python и может иметь собственный независимый набор установленных пакетов Python в своих каталогах.
Изменено в Python 3.11: Когда создаются новые виртуальные среды Python, то для для определения путей внутри среды venv
используется схема установки sysconfig
. Когда Python работает в виртуальной среде, по умолчанию используется та же схема установки. Это означает, что нижестоящие дистрибьюторы могут изменить схему установки по умолчанию, без изменения поведения самих виртуальных сред. Сторонний код, который также может создавать новые виртуальные среды, должен делать то же самое.
Если в операционной системе по умолчанию используется Python 3 и не нравиться функциональность встроенного модуля venv
, то модуль virtualenv
можно установить как скомпилированный пакет операционной системы.
# Для пользователей Ubuntu, Debian $ sudo apt install python3-virtualenv $ virtualenv --version virtualenv 20.0.17 from /usr/lib/python3/dist-packages/virtualenv/__init__.py
Виртуальная среда — это среда Python, в которой установленный в ней интерпретатор Python, библиотеки и скрипты изолированы от других виртуальных сред и изолированы от любых библиотек, установленных в Python как часть операционной системы.
Обычные инструменты установки, такие как setuptools
и pip
работают в виртуальных средах как и ожидается. Другими словами, когда виртуальная среда активна, они устанавливают пакеты Python в виртуальную среду без необходимости явно указывать это.
Когда виртуальная среда активна, т. е. работает интерпретатор Python виртуальной среды, атрибуты sys.prefix
и sys.exec_prefix
указывают на базовый каталог виртуальной среды, тогда как sys.base_prefix
и sys.base_exec_prefix
останутся указывать на базовую установку Python, ту, из которой была создана виртуальная среда. Если виртуальная среда не активна, то sys.prefix
совпадает с sys.base_prefix
, а sys.exec_prefix
будет совпадать с sys.base_exec_prefix
, все они указывают на установку Python не в виртуальной среде.
Когда виртуальная среда активна, любые параметры, которые изменяют путь установки, будут игнорироваться во всех файлах конфигурации distutils
, чтобы предотвратить случайную установку проектов вне виртуальной среды.
Работая в командной оболочке, пользователи могут активизировать виртуальную среду, запустив сценарий активации в каталоге исполняемых файлов виртуальной среды source <venv>/bin/activate
, который добавляет каталог виртуальной среды для исполняемых файлов в переменную окружения PATH
для работающей оболочки.
Создание виртуальной среды в OS Linux/Windows.
Создание виртуальной среды в OS Linux выполняется с помощью команды venv
:
# в виртуальную среду установится системная версия Python3 # т.е. версия установленная по умолчанию в вашей системе $ python3 -m venv /path/to/new/virtual/environment --prompt Python3.9
Представленная выше команда создает целевой каталог environment
, создавая все не существующие родительские каталоги. После этого python поместит в него файл pyvenv.cfg
с ключом, который будет указывать на ту версию Python, для которой запущена эта команда. Она также создает подкаталог bin
в Unix или Scripts
в Windows, содержащий копию/символическую ссылку двоичных файлов Python в зависимости от платформы или аргументов, используемых во время создания среды. Вышеуказанная команда также создает изначально пустой подкаталог lib/pythonX.Y/site-packages
в Unix, в Windows это Lib\site-packages
. Если указан существующий каталог виртуальной среды, то он будет использован повторно.
Если, например, вы собрали Python3.11 из исходников в папку /opt/python-3.11.0/
и хотите именно его поставить в виртуальную среду, то команда будет выглядеть следующим образом:
# в виртуальную среду установится версия Python # расположенная по пути /opt/python-3.11.0/bin/python3.11 $ /opt/python-3.11.0/bin/python3.11 -m venv ~/.python3.11.0 --prompt Python3.11
Представленная выше команда установит версию Python, который был собран из исходников в каталоге /opt/python-3.11.0/
, в папку виртуальной среды ~/.python3.11.0
. Папка виртуальной среды будет расположена в скрытой (точка впереди названия папки) домашней (~/
) директории пользователя. Параметр --prompt Python3.11
создаст, после активации, дополнительную подсказку о том, что вы находитесь в виртуальной среде Python3.11.
Активировать установленный Python в такой виртуальной среде можно командой:
$ source ~/.python3.11.0/bin/activate # в скобках - та самая подсказка, о которой говорилось выше (Python3.11) :~$
Установить дополнительные модули/пакеты для этой виртуальной среды можно только если она (виртуальная среда) активирована. Например, установка фреймворка pytest
будет выглядеть следующим образом:
# команда установит модуль `pytest` # в папку виртуальной среды ~/.python3.11.0 (Python3.11) :~$ python3 -m pip install -U pytest
Для создания виртуальной среды в OS Windows, необходимо вызвать команду venv
следующим образом:
c:>c:Python39python -m venv c:pathtomyenv --prompt Python3.9
В качестве альтернативы, если настроены переменные PATH
и PATHEXT
для установки Python:
c:>python3 -m venv c:pathtomyenv
Для venv
может быть задано несколько путей, и в этом случае будет создана идентичная виртуальная среда в соответствии с заданными параметрами для каждого указанного пути.
После создания виртуальной среды ее можно «активировать» с помощью сценария, расположенном каталоге виртуальной среды. Вызов сценария зависит от платформы:
Платформа | Оболочка | Команда активации виртуальной среды |
POSIX | bash/zsh | $ source venv/bin/activate |
fish | $ . venv/bin/activate.fish |
|
csh/tcsh | $ source venv/bin/activate.csh |
|
PowerShell Core | $ venv/bin/Activate.ps1 |
|
Windows | cmd.exe | C:> venvScriptsactivate.bat |
PowerShell | PS C:> venvScriptsActivate.ps1 |
Примечание к таблице: venv
должен быть заменен путем к каталогу, содержащему виртуальную среду:
Не нужно специально активировать среду если сценарий запускается с указанием полного пути до интерпретатора Python, установленного в виртуальную среду. Активация просто добавляет каталог виртуальной среды к пути интерпретатора Python тем самым давая возможность запускать сценарии не используя полный путь.
Вы можете «деактивировать» виртуальную среду, набрав команду deactivate
в своей оболочке. Точный механизм зависит от платформы и является внутренней деталью реализации. Обычно используется скрипт или функция оболочки.
Примеры:
Установка виртуальной среды в директорию env
:
Активация виртуальной среды env
:
$ source ~/env/bin/activate (env) docs-python@IdeaCentre:~$
Установка пакетов в виртуальную среду env
:
(env) $ python3 -m pip install pymysql # или (env) $ pip install pymysql
Выполнение сценариев в виртуальной среде env
:
(env) $ python ~/env/test.py
Деактивация виртуальной среды:
(env) $ deactivate # произойдет выход из виртуального окружения $
Не нужно специально активировать среду если сценарий запускается с указанием полного пути до интерпретатора Python:
$ ~/env/bin/python3 ~/env/test.py
Если команда python3 -m venv
запускается с опцией -h, то можно увидеть доступные опции:
$ python3 -m venv -h usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...] ... ...
ENV_DIR
— Каталог для создания виртуальной среды.
:
-h
,--help
— показать справочное сообщение и выйти,--system-site-packages
— предоставляет виртуальной среде доступ к системным пакетамsite-packages
,--symlinks
— при установке виртуальной среды создает символические ссылки вместо копирования файлов,--copies
— при установке виртуальной среды копирует файлы вместо создания символических ссылок,--clear
— перед созданием виртуальной среды удаляет содержимое каталога, если он уже существует,--upgrade
— Обновите каталог виртуальной среды, чтобы использовать установленную версию Python,--without-pip
— пропускает установку или обновлениеpip
в виртуальной среде (pip загружается по умолчанию),--prompt PROMPT
— предоставляет альтернативный префикс приглашения для этой среды.
Примечания:
- Хотя в Windows поддерживаются символические ссылки, они не рекомендуются. Особо следует отметить, что двойной щелчок по
python.exe
в проводнике файлов разрешит символическую ссылку и проигнорирует виртуальную среду. - В Microsoft Windows может потребоваться включить сценарий
Activate.ps1
, установив политику выполнения для пользователя. Вы можете сделать это, введя следующую команду PowerShell:PS C: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Созданный файл pyvenv.cfg
также содержит ключ include-system-site-packages
, для которого установлено значение true
, если venv
запускается с параметром --system-site-packages
, в противном случае значение будет false
.
Если не указана опция --without-pip
, то будет вызываться модуль ensurepip
для начальной загрузки pip
в виртуальную среду.