Окружения: venv, Poetry, uv
Окружение это отдельная папка с Python и пакетами для одного проекта. После урока вы создадите окружение тремя способами: venv, Poetry и uv. Потом выберете один.
Зачем нужны окружения
Заголовок раздела «Зачем нужны окружения»Без окружения все пакеты лежат в одном месте. Это ломается так:
- Проект A нужен
pandas 1.5. Проекту B нуженpandas 2.2. Вместе они не живут. - Вы поставили пакет, забыли записать. Коллега не может запустить код.
- Установка в системный Python может сломать системные утилиты.
Окружение решает это. У каждого проекта своя папка .venv со своими версиями. Список пакетов записан в файл. Любой человек повторит окружение одной командой.
| Термин | Что это |
|---|---|
| pip | Ставит пакеты из PyPI |
| venv | Создаёт окружение (встроен в Python) |
| requirements.txt | Список пакетов с версиями |
| lock-файл | Точные версии всех пакетов, включая вложенные |
| pyproject.toml | Описание проекта и его зависимостей |
Во всех примерах ниже мы ставим requests и запускаем скрипт app.py:
import requests
print("requests", requests.__version__)Версии у вас могут отличаться. Это нормально.
Способ 1. pip и venv
Заголовок раздела «Способ 1. pip и venv»Встроено в Python. Ничего ставить не нужно.
Проверка:
python3 -m venv --helppython3 -m pip --versionНа Ubuntu, если venv нет: sudo apt install python3.14-venv.
Проверка:
python -m venv --helppython -m pip --versionПрактика: venv
Заголовок раздела «Практика: venv»Создайте папку проекта и файл app.py (код выше).
mkdir venv-demo && cd venv-demopython3 -m venv .venvsource .venv/bin/activatewhich pythonmkdir venv-demo; cd venv-demopython -m venv .venv.venv\Scripts\Activate.ps1where.exe pythonЕсли PowerShell запрещает скрипты: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned. В cmd используйте .venv\Scripts\activate.bat.
Проверка: в начале строки терминала есть (.venv), а which python показывает путь внутри .venv:
/.../venv-demo/.venv/bin/pythonУстановите пакет и запишите версии:
pip install requestspip freezepip freeze > requirements.txtpython app.pycertifi==2026.10.23charset-normalizer==3.5.2idna==3.20requests==2.34.2urllib3==2.8.0requests 2.34.2pip freeze показывает все установленные пакеты, и ваши, и вложенные.
Выйдите и удалите окружение:
deactivaterm -rf .venv # Windows: rmdir /s /q .venvВосстановите по файлу:
python3 -m venv .venv.venv/bin/pip install -r requirements.txt # Windows: .venv\Scripts\pip.venv/bin/python app.pyrequests 2.34.2Минусы связки: нет lock-файла для вложенных пакетов, нет разделения на dev и prod, requirements.txt ведёте вручную.
Способ 2. Poetry
Заголовок раздела «Способ 2. Poetry»Poetry ведёт зависимости, lock-файл и окружение вместе.
Установка Poetry
Заголовок раздела «Установка Poetry»Рекомендуемый способ: pipx. Он ставит утилиты в свои изолированные окружения.
brew install pipxpipx ensurepathpipx install poetrypoetry --versionsudo apt install pipx # Fedora: sudo dnf install pipxpipx ensurepathpipx install poetrypoetry --versionpython -m pip install --user pipxpython -m pipx ensurepathpipx install poetrypoetry --versionОткройте новый терминал после ensurepath.
Нужен Poetry 2.x. Он хранит зависимости в стандартной секции [project].
Практика: Poetry
Заголовок раздела «Практика: Poetry»Создайте проект и положите в него app.py:
poetry new poetry-democd poetry-demoPoetry 2.x создаёт структуру с папкой src:
README.mdpyproject.tomlsrc/ poetry_demo/tests/По умолчанию Poetry хранит окружения в общей папке. Попросите его создать .venv внутри проекта:
poetry config virtualenvs.in-project true --localУкажите Python 3.14 и добавьте requests:
poetry env use 3.14poetry add requestsCreating virtualenv poetry-demo in .../poetry-demo/.venvUsing virtualenv: .../poetry-demo/.venvUsing version ^2.34.2 for requests
Updating dependenciesResolving dependencies...
Package operations: 5 installs, 0 updates, 0 removals
• Installing certifi (2026.10.23) • Installing charset-normalizer (3.5.2) • Installing idna (3.20) • Installing urllib3 (2.8.0) • Installing requests (2.34.2)
Writing lock filePoetry записал зависимость в pyproject.toml. В Poetry 2.x это выглядит так:
[project]name = "poetry-demo"version = "0.1.0"requires-python = ">=3.14"dependencies = [ "requests (>=2.34.2,<3.0.0)"]Значение requires-python у вас может быть другим. Poetry берёт его из версии Python, на которой работает сам.
И создал poetry.lock. Это lock-файл. Коммитьте его в git.
Запустите скрипт и посмотрите дерево зависимостей:
poetry run python app.pypoetry show --treerequests 2.34.2requests 2.34.2 Python HTTP for Humans.├── certifi >=2023.5.7├── charset-normalizer >=2,<4├── idna >=2.5,<4└── urllib3 >=1.26,<3Lock-файл и повтор установки:
poetry lockpoetry installЕсли зависимости не менялись, poetry install не ставит пакеты заново. На новой машине он создаст окружение по poetry.lock.
Удалите окружение:
poetry env remove --allDeleted virtualenv: .../poetry-demo/.venvВ Poetry 2.x команды poetry shell больше нет. Её вынесли в плагин poetry-plugin-shell. Чтобы активировать окружение, есть eval $(poetry env activate). Проще всего использовать poetry run ....
Минусы: медленнее uv. Сам Poetry надо ставить отдельно. Обычно Poetry берёт уже установленный Python. Скачивать Python умеет только команда poetry python install (с версии 2.1, пока экспериментальная).
Способ 3. uv
Заголовок раздела «Способ 3. uv»uv это быстрый менеджер проектов и пакетов на Rust. Он заменяет pip, venv, pip-tools и во многом Poetry. Он умеет сам скачать нужную версию Python.
Установка uv
Заголовок раздела «Установка uv»brew install uvuv --versionИли: curl -LsSf https://astral.sh/uv/install.sh | sh
curl -LsSf https://astral.sh/uv/install.sh | shuv --versionОткройте новый терминал после установки.
winget install --id=astral-sh.uv -euv --versionИли: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Практика: uv
Заголовок раздела «Практика: uv»Создайте проект на Python 3.14:
uv init uv-demo --python 3.14cd uv-demols -a.git .gitignore .python-version README.md main.py pyproject.tomlФлаг --python 3.14 делает две вещи:
- пишет
3.14в файл.python-version; - пишет
requires-python = ">=3.14"вpyproject.toml.
Если 3.14 нет на машине, uv скачает его сам при первом запуске. Сменить версию позже: uv python pin 3.13. Эта команда меняет только .python-version.
Добавьте requests:
uv add requestsUsing CPython 3.14.0 interpreter at: /opt/homebrew/opt/python@3.14/bin/python3.14Creating virtual environment at: .venvResolved 6 packages in 2msPrepared 4 packages in 3.03sInstalled 5 packages in 5ms + certifi==2026.10.23 + charset-normalizer==3.5.2 + idna==3.20 + requests==2.34.2 + urllib3==2.8.0В pyproject.toml появилась строка:
dependencies = [ "requests>=2.34.2",]А ещё файл uv.lock с точными версиями и хешами. Коммитьте его в git.
Положите app.py в папку и запустите:
uv run app.pyuv treerequests 2.34.2uv-demo v0.1.0└── requests v2.34.2 ├── certifi v2026.10.23 ├── charset-normalizer v3.5.2 ├── idna v3.20 └── urllib3 v2.8.0uv run сам создаёт окружение, если его нет, и синхронизирует пакеты. Активировать ничего не нужно.
Lock и sync:
uv lockuv syncResolved 6 packages in 0.52msAudited 5 packages in 0.00msУдалите зависимость и верните её:
uv remove requestsuv add requestsУдалите окружение. Оно пересоздаётся командой uv sync:
rm -rf .venv # Windows: rmdir /s /q .venvuv syncЕсли нужен pip-подобный режим внутри проекта: uv pip install ..., uv pip list. Но для проектов лучше uv add.
Сравнение
Заголовок раздела «Сравнение»| pip + venv | Poetry | uv | |
|---|---|---|---|
| Установка | Встроен | Отдельно (pipx) | Один бинарный файл |
| Lock-файл | Нет (pip freeze) | poetry.lock | uv.lock |
| Файл зависимостей | requirements.txt | pyproject.toml | pyproject.toml |
| Скачивает Python | Нет | Экспериментально (2.1+) | Да |
| Скорость | Обычная | Средняя | Очень высокая |
| Запуск без activate | .venv/bin/python | poetry run | uv run |
| Публикация пакета | Нет | Да | Да (uv build, uv publish) |
Когда что выбрать:
- venv + pip: быстрый скрипт на чужой машине, где больше ничего нет. Или в Docker-образе, где просто нужен
requirements.txt. - Poetry: в команде уже есть Poetry-проекты. Тогда не меняйте инструмент.
- uv: новый проект, учёба, ETL, ноутбуки. Выбор по умолчанию.
Рекомендация: uv
Заголовок раздела «Рекомендация: uv»Используйте uv в этом курсе и в новых проектах.
- Одна утилита вместо трёх.
- Сам ставит нужный Python.
- Быстрый: установка занимает секунды.
- Стандартный
pyproject.toml, как у Poetry 2.x. Миграция проста.
В следующих уроках пишите uv run file.py. Если вы выбрали другой инструмент, запускайте так, как показано выше.
Где это в работе
Заголовок раздела «Где это в работе»- Каждый ETL-проект имеет свой lock-файл. Так пайплайн на сервере ставит те же версии, что у вас.
- В CI делают
uv syncилиpoetry install, а потом запускают тесты. - В Docker копируют
pyproject.tomlи lock-файл, затем ставят зависимости. Это даёт повторяемую сборку. .venvне коммитят в git. Коммитятpyproject.tomlи lock-файл.
Задания
Заголовок раздела «Задания»Задание 1. venv с нуля
Заголовок раздела «Задание 1. venv с нуля»Создайте venv, поставьте requests, запишите requirements.txt, удалите .venv и восстановите.
Решение
python3 -m venv .venvsource .venv/bin/activatepip install requestspip freeze > requirements.txtdeactivaterm -rf .venvpython3 -m venv .venv.venv/bin/pip install -r requirements.txt.venv/bin/python app.pyПроверка: последняя команда печатает requests 2.34.2 (ваша версия может быть другой).
Задание 2. Какой Python работает?
Заголовок раздела «Задание 2. Какой Python работает?»Активируйте .venv и найдите путь к python. Выйдите и проверьте ещё раз.
Решение
source .venv/bin/activatewhich pythondeactivatewhich pythonПроверка: в первом случае путь заканчивается на .venv/bin/python. Во втором путь ведёт в системный или pyenv Python.
Задание 3. Проект на uv
Заголовок раздела «Задание 3. Проект на uv»Создайте проект shop-uv на Python 3.14, добавьте requests, запустите app.py.
Решение
uv init shop-uv --python 3.14cd shop-uvuv add requests# создайте app.py из урокаuv run app.pyПроверка: requests 2.34.2. В папке есть uv.lock, а в pyproject.toml строка "requests>=...".
Задание 4. Проект на Poetry
Заголовок раздела «Задание 4. Проект на Poetry»То же самое на Poetry. Затем покажите дерево зависимостей.
Решение
poetry new shop-poetrycd shop-poetrypoetry env use 3.14poetry add requests# создайте app.py из урокаpoetry run python app.pypoetry show --treeПроверка: requests 2.34.2, затем дерево с certifi, charset-normalizer, idna, urllib3. В папке есть poetry.lock.
Задание 5. Повторите окружение на «новой машине»
Заголовок раздела «Задание 5. Повторите окружение на «новой машине»»Удалите .venv в проекте uv и восстановите по lock-файлу. Затем запустите скрипт.
Решение
rm -rf .venvuv syncuv run app.pyПроверка: uv sync создаёт .venv и ставит те же версии. Скрипт печатает ту же версию requests.
Задание 6. Выберите инструмент
Заголовок раздела «Задание 6. Выберите инструмент»Для каждой ситуации выберите инструмент и объясните в одном предложении: (а) новый ETL-проект, (б) команда уже на Poetry, (в) одноразовый скрипт на сервере без доступа к установке программ.
Решение
- (а)
uv: быстрый, lock-файл, сам ставит Python. - (б) Poetry: не смешивайте инструменты без причины.
- (в)
venv+pip: уже встроены в Python.
Что запомнить
Заголовок раздела «Что запомнить»- Один проект, одно окружение. Папку
.venvне коммитят. - Версии фиксируют в lock-файле (
uv.lock,poetry.lock) или вrequirements.txt. uv run file.pyиpoetry run python file.pyработают без activate.uvлучший выбор для новых проектов.- Не ставьте пакеты в системный Python.
Дальше: Переменные и типы данных. Теория: Python Crash Course, глава 1 и приложение B.