HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Статья расскажет, зачем нужна виртуальная среда в проектах на Python. Что это такое, как она используется, на что стоит обратить внимание.</p>
1 <p>Статья расскажет, зачем нужна виртуальная среда в проектах на Python. Что это такое, как она используется, на что стоит обратить внимание.</p>
2 <h2>Виртуальное окружение - для чего оно?</h2>
2 <h2>Виртуальное окружение - для чего оно?</h2>
3 <p>Язык программирования Python, как многие другие языки, обладает своим уникальным способом загрузки и хранения пакетов (модулей). Это имеет как плюсы, так и минусы. Дело в том, что есть несколько расположений, где сохраняются пакеты, установленные в системе. Большая часть их хранится в дочернем каталоге пути, а он, в свою очередь, находится в<em>sys.prefix</em>.</p>
3 <p>Язык программирования Python, как многие другие языки, обладает своим уникальным способом загрузки и хранения пакетов (модулей). Это имеет как плюсы, так и минусы. Дело в том, что есть несколько расположений, где сохраняются пакеты, установленные в системе. Большая часть их хранится в дочернем каталоге пути, а он, в свою очередь, находится в<em>sys.prefix</em>.</p>
4 <p>На том же Маке можно без проблем найти, где конкретно sys.prefix указывает на применение оболочки Python:</p>
4 <p>На том же Маке можно без проблем найти, где конкретно sys.prefix указывает на применение оболочки Python:</p>
5 <p>Нас интересуют в большей мере сторонние пакеты, которые установлены посредством<em>easy_install</em>либо<em>pip install</em>. В большинстве случаев они находятся в одной из директорий, на которую указывает<strong>site.getsitepackages</strong>:</p>
5 <p>Нас интересуют в большей мере сторонние пакеты, которые установлены посредством<em>easy_install</em>либо<em>pip install</em>. В большинстве случаев они находятся в одной из директорий, на которую указывает<strong>site.getsitepackages</strong>:</p>
6 <p>Все эти нюансы следует знать, чтобы понимать ситуацию, ведь по дефолту каждый системный объект станет применять одинаковые каталоги при хранении пакетов. Может показаться, что это несущественно. Да, если речь идёт о системных пакетах, которые считаются частью стандартной библиотеки. Совсем другое дело, если речь идёт о сторонних пакетах.</p>
6 <p>Все эти нюансы следует знать, чтобы понимать ситуацию, ведь по дефолту каждый системный объект станет применять одинаковые каталоги при хранении пакетов. Может показаться, что это несущественно. Да, если речь идёт о системных пакетах, которые считаются частью стандартной библиотеки. Совсем другое дело, если речь идёт о сторонних пакетах.</p>
7 <p>Представьте простую ситуацию: у вас 2 пакета (ProjectA and ProjectB). Оба связаны зависимостью с одной и той же библиотекой - ProjectC. Если же мы начнём запрашивать различные версии ProjectC, могут возникнуть затруднения. ProjectA может запросить одну версию (1.0), а ProjectB - другую, более новую (2.0). В этом и заключается большая проблема "Питона" -<strong>он не различает версии в каталоге "site-packages"</strong>.</p>
7 <p>Представьте простую ситуацию: у вас 2 пакета (ProjectA and ProjectB). Оба связаны зависимостью с одной и той же библиотекой - ProjectC. Если же мы начнём запрашивать различные версии ProjectC, могут возникнуть затруднения. ProjectA может запросить одну версию (1.0), а ProjectB - другую, более новую (2.0). В этом и заключается большая проблема "Питона" -<strong>он не различает версии в каталоге "site-packages"</strong>.</p>
8 <p>Раз проекты хранятся с учётом их названий, различий между версиями нет, в результате чего ProjectA и ProjectB будут применять одну и ту же версию, а это не есть хорошо.</p>
8 <p>Раз проекты хранятся с учётом их названий, различий между версиями нет, в результате чего ProjectA и ProjectB будут применять одну и ту же версию, а это не есть хорошо.</p>
9 <p>Как раз здесь на сцену и выходит<strong>виртуальное окружение (среда) Python</strong>, делая это совместно с инструментами<em>virtualenv/ven</em>.</p>
9 <p>Как раз здесь на сцену и выходит<strong>виртуальное окружение (среда) Python</strong>, делая это совместно с инструментами<em>virtualenv/ven</em>.</p>
10 <h2>Так что же такое виртуальное окружение (virtual environment)?</h2>
10 <h2>Так что же такое виртуальное окружение (virtual environment)?</h2>
11 <p>Основной задачей виртуального окружения в языке Python является создание изолированной среды для "Пайтон"-проектов. Что это значит: - любой проект способен иметь собственные зависимости; - зависимости второго проекта не оказывают влияния на зависимости первого и наоборот.</p>
11 <p>Основной задачей виртуального окружения в языке Python является создание изолированной среды для "Пайтон"-проектов. Что это значит: - любой проект способен иметь собственные зависимости; - зависимости второго проекта не оказывают влияния на зависимости первого и наоборот.</p>
12 <p>Если вернуться к примеру выше, становится очевидным, что следует просто разделить виртуальные окружения для ProjectA и ProjectB. В итоге каждая отдельная среда будет зависеть от любой версии ProjectC и не зависеть друг от друга.</p>
12 <p>Если вернуться к примеру выше, становится очевидным, что следует просто разделить виртуальные окружения для ProjectA и ProjectB. В итоге каждая отдельная среда будет зависеть от любой версии ProjectC и не зависеть друг от друга.</p>
13 <p>Профит налицо, ведь отсутствуют ограничения на то, во скольких экземплярах будет виртуальное окружение, ведь они являются обычными директориями, где содержится несколько скриптов. А ещё их довольно легко создать, используя средства командной строки - речь идёт об инструментах virtualenv либо pyenv для Python.</p>
13 <p>Профит налицо, ведь отсутствуют ограничения на то, во скольких экземплярах будет виртуальное окружение, ведь они являются обычными директориями, где содержится несколько скриптов. А ещё их довольно легко создать, используя средства командной строки - речь идёт об инструментах virtualenv либо pyenv для Python.</p>
14 <h2>Применение виртуальной среды</h2>
14 <h2>Применение виртуальной среды</h2>
15 <p>Если у вас Python 3, модуль<em>venv</em>должен быть уже установлен. Если же нет, вопрос можно решить, выполнив установку Python-инструмента<em>virtualenv</em>посредством pip:</p>
15 <p>Если у вас Python 3, модуль<em>venv</em>должен быть уже установлен. Если же нет, вопрос можно решить, выполнив установку Python-инструмента<em>virtualenv</em>посредством pip:</p>
16 <p>Внимание! Следует понимать, что venv и virtualenv - это, по сути, 2 разных инструмента, имеющих несколько различий в плане команд.</p>
16 <p>Внимание! Следует понимать, что venv и virtualenv - это, по сути, 2 разных инструмента, имеющих несколько различий в плане команд.</p>
17 <p>Создадим новый каталог, с которым потом станем работать, следующей командой:</p>
17 <p>Создадим новый каталог, с которым потом станем работать, следующей командой:</p>
18 <p>Теперь создадим новое виртуальное окружение внутри каталога:</p>
18 <p>Теперь создадим новое виртуальное окружение внутри каталога:</p>
19 <p>Внимание! По дефолту ни один из существующих сторонних пакетов не включён.</p>
19 <p>Внимание! По дефолту ни один из существующих сторонних пакетов не включён.</p>
20 <p>В Python 3 подход venv имеет преимущество, вынуждающее применять определённую версию Python-интерпретатора, который нужен для создания виртуальной среды. Зато вы избежите проблем, выясняя, какая именно инсталляция "Пайтон" базируется в новом виртуальном окружении.</p>
20 <p>В Python 3 подход venv имеет преимущество, вынуждающее применять определённую версию Python-интерпретатора, который нужен для создания виртуальной среды. Зато вы избежите проблем, выясняя, какая именно инсталляция "Пайтон" базируется в новом виртуальном окружении.</p>
21 <p>Начиная с версий 3.3 и 3.4, рекомендуется создавать окружение посредством pyvenv в командной строке (данный инструмент также включён в инсталляционный пакет "Пайтона" по дефолту). Но уже с 3.6 и далее потребуется<em>python3 -m venv</em>.</p>
21 <p>Начиная с версий 3.3 и 3.4, рекомендуется создавать окружение посредством pyvenv в командной строке (данный инструмент также включён в инсталляционный пакет "Пайтона" по дефолту). Но уже с 3.6 и далее потребуется<em>python3 -m venv</em>.</p>
22 <p>В вышеуказанном примере данная команда создаст каталог "env", структура которого будет выглядеть приблизительно так:</p>
22 <p>В вышеуказанном примере данная команда создаст каталог "env", структура которого будет выглядеть приблизительно так:</p>
23 <p>Разберём, что в папках, подробнее: •<strong>bin</strong>- это файлы, взаимодействующие с виртуальным окружением; •<strong>include</strong>- это С-заголовки, которые компилируют Python-пакеты; •<strong>lib</strong>- это копия Python-версии совместно с папкой "site-packages", где находится каждая зависимость.</p>
23 <p>Разберём, что в папках, подробнее: •<strong>bin</strong>- это файлы, взаимодействующие с виртуальным окружением; •<strong>include</strong>- это С-заголовки, которые компилируют Python-пакеты; •<strong>lib</strong>- это копия Python-версии совместно с папкой "site-packages", где находится каждая зависимость.</p>
24 <p>Идём дальше. У нас в наличии копии (символические ссылки) ряда Python-инструментов. Данные файлы применяются, чтобы команды и "Пайтон"-код выполнялись в контексте созданной среды, что позволяет достичь изоляции от глобальной среды.</p>
24 <p>Идём дальше. У нас в наличии копии (символические ссылки) ряда Python-инструментов. Данные файлы применяются, чтобы команды и "Пайтон"-код выполнялись в контексте созданной среды, что позволяет достичь изоляции от глобальной среды.</p>
25 <p>Весьма интересны скрипты activate, находящиеся в bin. Они применяются в целях настройки вашей оболочки для применения исполняемого файла окружения "Пайтон" и его сайтовых пакетов по дефолту.</p>
25 <p>Весьма интересны скрипты activate, находящиеся в bin. Они применяются в целях настройки вашей оболочки для применения исполняемого файла окружения "Пайтон" и его сайтовых пакетов по дефолту.</p>
26 <p>Для использования этих пакетов среды в условиях изоляции, надо их активировать, выполнив активацию простой командой:</p>
26 <p>Для использования этих пакетов среды в условиях изоляции, надо их активировать, выполнив активацию простой командой:</p>
27 <p>Здесь важно учесть, что ваше приглашение командной строки уже носит префикс вашего окружения (для нашего примера это env). Речь идёт об индикаторе, свидетельствующем, что в данный момент времени env активен. Это, в свою очередь, подтверждает то, что выполнимые "Пайтон"-файлы задействуют пакеты и настройки лишь из этого виртуального окружения.</p>
27 <p>Здесь важно учесть, что ваше приглашение командной строки уже носит префикс вашего окружения (для нашего примера это env). Речь идёт об индикаторе, свидетельствующем, что в данный момент времени env активен. Это, в свою очередь, подтверждает то, что выполнимые "Пайтон"-файлы задействуют пакеты и настройки лишь из этого виртуального окружения.</p>
28 <p>Если надо показать изолированный пакет, что называется, в деле, подойдёт модуль<strong>bcrypt</strong>. Давайте скажем, что он установлен где-то в системе, а не в нашем виртуальном окружении.</p>
28 <p>Если надо показать изолированный пакет, что называется, в деле, подойдёт модуль<strong>bcrypt</strong>. Давайте скажем, что он установлен где-то в системе, а не в нашем виртуальном окружении.</p>
29 <p>Перед проверкой вернёмся назад в контекст "system" с помощью команды deactivate:</p>
29 <p>Перед проверкой вернёмся назад в контекст "system" с помощью команды deactivate:</p>
30 <p>Теперь сеанс оболочки вернулся в нормальное состояние, а команда<em>python</em>будет ссылаться на общую Python-инсталляцию. Сделать это можно, когда заблагорассудиться, но после того, как закроете определённое виртуальное окружение. Далее следует установить bcrypt и воспользоваться им в целях хэширования пароля:</p>
30 <p>Теперь сеанс оболочки вернулся в нормальное состояние, а команда<em>python</em>будет ссылаться на общую Python-инсталляцию. Сделать это можно, когда заблагорассудиться, но после того, как закроете определённое виртуальное окружение. Далее следует установить bcrypt и воспользоваться им в целях хэширования пароля:</p>
31 <p>А теперь давайте посмотрим, что случится, если попробовать ту же самую команду, когда виртуальное окружение активно:</p>
31 <p>А теперь давайте посмотрим, что случится, если попробовать ту же самую команду, когда виртуальное окружение активно:</p>
32 <p>Видно, что поведение команды<em>python -c "import bcrypt…"</em>меняется после вызова source env/bin/activate. Если в одном примере мы имеем доступный нам bcrypt, то в другом - нет. Это и является тем типом разделения, который нам нужен для создания виртуального окружения, его запуска и работы, то есть мы к нему и пришли.</p>
32 <p>Видно, что поведение команды<em>python -c "import bcrypt…"</em>меняется после вызова source env/bin/activate. Если в одном примере мы имеем доступный нам bcrypt, то в другом - нет. Это и является тем типом разделения, который нам нужен для создания виртуального окружения, его запуска и работы, то есть мы к нему и пришли.</p>
33 <p><em>По материалам статьи "<a>Python Virtual Environments: A Primer</a>".</em></p>
33 <p><em>По материалам статьи "<a>Python Virtual Environments: A Primer</a>".</em></p>
34  
34