0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Представим, что мы начинаем работу с несколькими проектами. В каждом проекте могут быть разные наборы зависимостей. Еще более тяжелый случай: разные проекты могут иметь в зависимостях разные версии одной и той же библиотеки.</p>
1
<p>Представим, что мы начинаем работу с несколькими проектами. В каждом проекте могут быть разные наборы зависимостей. Еще более тяжелый случай: разные проекты могут иметь в зависимостях разные версии одной и той же библиотеки.</p>
2
<p>Чтобы предотвратить возможный конфликт, пакетный менеджер устанавливает зависимости проекта в его собственную директорию зависимостей -<em>.venv</em>. Но это не единственная функция этой директории.</p>
2
<p>Чтобы предотвратить возможный конфликт, пакетный менеджер устанавливает зависимости проекта в его собственную директорию зависимостей -<em>.venv</em>. Но это не единственная функция этой директории.</p>
3
<h2>Виртуальное окружение</h2>
3
<h2>Виртуальное окружение</h2>
4
<p>Заглянем в директорию<em>.venv</em>:</p>
4
<p>Заглянем в директорию<em>.venv</em>:</p>
5
<p>Здесь нам важны две директории:<em>bin</em>и<em>lib</em>. Вторая директория,<em>lib/python3.XX/site-packages</em>вам уже знакома - в ней установлены все зависимости проекта. Тогда как в директории<em>.venv/bin</em>лежит ссылка на интерпретатор Python. Для чего это нужно? Давайте сперва поставим библиотеку в наш проект.</p>
5
<p>Здесь нам важны две директории:<em>bin</em>и<em>lib</em>. Вторая директория,<em>lib/python3.XX/site-packages</em>вам уже знакома - в ней установлены все зависимости проекта. Тогда как в директории<em>.venv/bin</em>лежит ссылка на интерпретатор Python. Для чего это нужно? Давайте сперва поставим библиотеку в наш проект.</p>
6
<p>Создадим новый файл<em>module.py</em>, импортируем библиотеку и сделаем пару вызовов:</p>
6
<p>Создадим новый файл<em>module.py</em>, импортируем библиотеку и сделаем пару вызовов:</p>
7
<p>Запустим наш модуль с кодом:</p>
7
<p>Запустим наш модуль с кодом:</p>
8
<p>Почему же мы получили ошибку, ведь мы установили библиотеку в проект? Суть в том, что Python используется в операционной системе для запуска системных утилит. Зависимости этих утилит хранятся в<em>/usr/lib/python3.XX/site-packages</em>- директории общей для всей системы. И Python ищет зависимости в своих, системных директориях.</p>
8
<p>Почему же мы получили ошибку, ведь мы установили библиотеку в проект? Суть в том, что Python используется в операционной системе для запуска системных утилит. Зависимости этих утилит хранятся в<em>/usr/lib/python3.XX/site-packages</em>- директории общей для всей системы. И Python ищет зависимости в своих, системных директориях.</p>
9
<p>Но ставить зависимости проекта в системные директории нельзя, будут конфликты. Тогда мы можем поступить наоборот, и запустить Python из директории<em>.venv</em>нашего проекта. Для этого в ней и лежит ссылка на интерпретатор.</p>
9
<p>Но ставить зависимости проекта в системные директории нельзя, будут конфликты. Тогда мы можем поступить наоборот, и запустить Python из директории<em>.venv</em>нашего проекта. Для этого в ней и лежит ссылка на интерпретатор.</p>
10
<p>Сочетание директории с зависимостями (<em>lib/python3.XX/site-packages</em>) и ссылки на интерпретатор (<em>bin/python3</em>) называется<em>окружением</em>. Окружение системного Python называют<em>глобальным окружением</em>, а окружение проекта локальным или чаще всего<em>виртуальным окружением</em>. Отсюда и название директории<em>.venv</em>-<strong>V</strong>irtual<strong>Env</strong>iroment.</p>
10
<p>Сочетание директории с зависимостями (<em>lib/python3.XX/site-packages</em>) и ссылки на интерпретатор (<em>bin/python3</em>) называется<em>окружением</em>. Окружение системного Python называют<em>глобальным окружением</em>, а окружение проекта локальным или чаще всего<em>виртуальным окружением</em>. Отсюда и название директории<em>.venv</em>-<strong>V</strong>irtual<strong>Env</strong>iroment.</p>
11
<p>Но каждый раз вызывать код указывая полный путь до интерпретатора внутри<em>.venv</em>утомительно. Потому существует механизм подмены пути автоматически -<em>активация окружения</em>. При активации в переменную PATH, подставляется путь до интерпретатора внутри<em>.venv</em>. Затем, когда мы вызовем команду python3, то запустится Python внутри окружения. А когда мы закончим работу в окружении, останется лишь вернуть прежний путь, или еще говорят<em>деактивировать</em>окружение, чтобы система продолжила использовать системный Python с его библиотеками.</p>
11
<p>Но каждый раз вызывать код указывая полный путь до интерпретатора внутри<em>.venv</em>утомительно. Потому существует механизм подмены пути автоматически -<em>активация окружения</em>. При активации в переменную PATH, подставляется путь до интерпретатора внутри<em>.venv</em>. Затем, когда мы вызовем команду python3, то запустится Python внутри окружения. А когда мы закончим работу в окружении, останется лишь вернуть прежний путь, или еще говорят<em>деактивировать</em>окружение, чтобы система продолжила использовать системный Python с его библиотеками.</p>
12
<p>В действительности этот процесс приходится выполнять так часто, что пакетные менеджеры его автоматизируют.</p>
12
<p>В действительности этот процесс приходится выполнять так часто, что пакетные менеджеры его автоматизируют.</p>
13
<p>Команда uv run <команда> активирует окружение, выполняет команду в нем и деактивирует его. Так вся работа с окружением скрыта от нас. В дальнейшем все команды запуска кода и утилит в проекте мы будем выполнять через uv run.</p>
13
<p>Команда uv run <команда> активирует окружение, выполняет команду в нем и деактивирует его. Так вся работа с окружением скрыта от нас. В дальнейшем все команды запуска кода и утилит в проекте мы будем выполнять через uv run.</p>
14
<p>Разные проекты могут требовать не только разных версий библиотек, но и разных версий Python. При этом обновлять Python, установленный в системе, нельзя - могут сломаться системные утилиты. К счастью, механизм окружений позволяет управлять не только зависимостями, но и интерпретаторами. Вместо ссылки на системный Python можно указать ссылку на другую, отдельно скачанную версию.</p>
14
<p>Разные проекты могут требовать не только разных версий библиотек, но и разных версий Python. При этом обновлять Python, установленный в системе, нельзя - могут сломаться системные утилиты. К счастью, механизм окружений позволяет управлять не только зависимостями, но и интерпретаторами. Вместо ссылки на системный Python можно указать ссылку на другую, отдельно скачанную версию.</p>
15
<p>uv также автоматизирует этот процесс, по умолчанию uv использует ссылку на системный интерпретатор, но для многих команд можно указать версию Python через флаг --python:</p>
15
<p>uv также автоматизирует этот процесс, по умолчанию uv использует ссылку на системный интерпретатор, но для многих команд можно указать версию Python через флаг --python:</p>
16
<p>Если указанной версии нет в системе, то uv скачает ее и будет использовать для текущего проекта. Системный Python это никак не затронет, так как интерпретатор проекта полностью изолирован.</p>
16
<p>Если указанной версии нет в системе, то uv скачает ее и будет использовать для текущего проекта. Системный Python это никак не затронет, так как интерпретатор проекта полностью изолирован.</p>