Перейти к содержимому
TelegramGitHub

Окружения: 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__)

Версии у вас могут отличаться. Это нормально.

Встроено в Python. Ничего ставить не нужно.

Проверка:

Окно терминала
python3 -m venv --help
python3 -m pip --version

На Ubuntu, если venv нет: sudo apt install python3.14-venv.

Создайте папку проекта и файл app.py (код выше).

Окно терминала
mkdir venv-demo && cd venv-demo
python3 -m venv .venv
source .venv/bin/activate
which python

Проверка: в начале строки терминала есть (.venv), а which python показывает путь внутри .venv:

/.../venv-demo/.venv/bin/python

Установите пакет и запишите версии:

Окно терминала
pip install requests
pip freeze
pip freeze > requirements.txt
python app.py
certifi==2026.10.23
charset-normalizer==3.5.2
idna==3.20
requests==2.34.2
urllib3==2.8.0
requests 2.34.2

pip freeze показывает все установленные пакеты, и ваши, и вложенные.

Выйдите и удалите окружение:

Окно терминала
deactivate
rm -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.py
requests 2.34.2

Минусы связки: нет lock-файла для вложенных пакетов, нет разделения на dev и prod, requirements.txt ведёте вручную.

Poetry ведёт зависимости, lock-файл и окружение вместе.

Рекомендуемый способ: pipx. Он ставит утилиты в свои изолированные окружения.

Окно терминала
brew install pipx
pipx ensurepath
pipx install poetry
poetry --version

Нужен Poetry 2.x. Он хранит зависимости в стандартной секции [project].

Создайте проект и положите в него app.py:

Окно терминала
poetry new poetry-demo
cd poetry-demo

Poetry 2.x создаёт структуру с папкой src:

README.md
pyproject.toml
src/
poetry_demo/
tests/

По умолчанию Poetry хранит окружения в общей папке. Попросите его создать .venv внутри проекта:

Окно терминала
poetry config virtualenvs.in-project true --local

Укажите Python 3.14 и добавьте requests:

Окно терминала
poetry env use 3.14
poetry add requests
Creating virtualenv poetry-demo in .../poetry-demo/.venv
Using virtualenv: .../poetry-demo/.venv
Using version ^2.34.2 for requests
Updating dependencies
Resolving 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 file

Poetry записал зависимость в 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.py
poetry show --tree
requests 2.34.2
requests 2.34.2 Python HTTP for Humans.
├── certifi >=2023.5.7
├── charset-normalizer >=2,<4
├── idna >=2.5,<4
└── urllib3 >=1.26,<3

Lock-файл и повтор установки:

Окно терминала
poetry lock
poetry install

Если зависимости не менялись, poetry install не ставит пакеты заново. На новой машине он создаст окружение по poetry.lock.

Удалите окружение:

Окно терминала
poetry env remove --all
Deleted 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, пока экспериментальная).

uv это быстрый менеджер проектов и пакетов на Rust. Он заменяет pip, venv, pip-tools и во многом Poetry. Он умеет сам скачать нужную версию Python.

Окно терминала
brew install uv
uv --version

Или: curl -LsSf https://astral.sh/uv/install.sh | sh

Создайте проект на Python 3.14:

Окно терминала
uv init uv-demo --python 3.14
cd uv-demo
ls -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 requests
Using CPython 3.14.0 interpreter at: /opt/homebrew/opt/python@3.14/bin/python3.14
Creating virtual environment at: .venv
Resolved 6 packages in 2ms
Prepared 4 packages in 3.03s
Installed 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.py
uv tree
requests 2.34.2
uv-demo v0.1.0
└── requests v2.34.2
├── certifi v2026.10.23
├── charset-normalizer v3.5.2
├── idna v3.20
└── urllib3 v2.8.0

uv run сам создаёт окружение, если его нет, и синхронизирует пакеты. Активировать ничего не нужно.

Lock и sync:

Окно терминала
uv lock
uv sync
Resolved 6 packages in 0.52ms
Audited 5 packages in 0.00ms

Удалите зависимость и верните её:

Окно терминала
uv remove requests
uv add requests

Удалите окружение. Оно пересоздаётся командой uv sync:

Окно терминала
rm -rf .venv # Windows: rmdir /s /q .venv
uv sync

Если нужен pip-подобный режим внутри проекта: uv pip install ..., uv pip list. Но для проектов лучше uv add.

pip + venvPoetryuv
УстановкаВстроенОтдельно (pipx)Один бинарный файл
Lock-файлНет (pip freeze)poetry.lockuv.lock
Файл зависимостейrequirements.txtpyproject.tomlpyproject.toml
Скачивает PythonНетЭкспериментально (2.1+)Да
СкоростьОбычнаяСредняяОчень высокая
Запуск без activate.venv/bin/pythonpoetry runuv run
Публикация пакетаНетДаДа (uv build, uv publish)

Когда что выбрать:

  • venv + pip: быстрый скрипт на чужой машине, где больше ничего нет. Или в Docker-образе, где просто нужен requirements.txt.
  • Poetry: в команде уже есть Poetry-проекты. Тогда не меняйте инструмент.
  • uv: новый проект, учёба, ETL, ноутбуки. Выбор по умолчанию.

Используйте 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-файл.

Создайте venv, поставьте requests, запишите requirements.txt, удалите .venv и восстановите.

Решение
Окно терминала
python3 -m venv .venv
source .venv/bin/activate
pip install requests
pip freeze > requirements.txt
deactivate
rm -rf .venv
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python app.py

Проверка: последняя команда печатает requests 2.34.2 (ваша версия может быть другой).

Активируйте .venv и найдите путь к python. Выйдите и проверьте ещё раз.

Решение
Окно терминала
source .venv/bin/activate
which python
deactivate
which python

Проверка: в первом случае путь заканчивается на .venv/bin/python. Во втором путь ведёт в системный или pyenv Python.

Создайте проект shop-uv на Python 3.14, добавьте requests, запустите app.py.

Решение
Окно терминала
uv init shop-uv --python 3.14
cd shop-uv
uv add requests
# создайте app.py из урока
uv run app.py

Проверка: requests 2.34.2. В папке есть uv.lock, а в pyproject.toml строка "requests>=...".

То же самое на Poetry. Затем покажите дерево зависимостей.

Решение
Окно терминала
poetry new shop-poetry
cd shop-poetry
poetry env use 3.14
poetry add requests
# создайте app.py из урока
poetry run python app.py
poetry show --tree

Проверка: requests 2.34.2, затем дерево с certifi, charset-normalizer, idna, urllib3. В папке есть poetry.lock.

Задание 5. Повторите окружение на «новой машине»

Заголовок раздела «Задание 5. Повторите окружение на «новой машине»»

Удалите .venv в проекте uv и восстановите по lock-файлу. Затем запустите скрипт.

Решение
Окно терминала
rm -rf .venv
uv sync
uv run app.py

Проверка: uv sync создаёт .venv и ставит те же версии. Скрипт печатает ту же версию requests.

Для каждой ситуации выберите инструмент и объясните в одном предложении: (а) новый 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.