Kodokon kodokon.com

Виртуальные окружения, pip и чистый проект

Изолируй каждый проект в собственном venv, фиксируй зависимости и придерживайся воспроизводимой структуры проекта.

8 мин · 3 вопросов

Открыть этот урок в Kodokon

Установка зависимостей всех твоих проектов в один интерпретатор ведёт прямиком к конфликту версий: проекту A нужен requests 2.31, проекту B - несовместимая версия. Виртуальное окружение (venv) изолирует каждый проект: свой интерпретатор, свой pip, свои пакеты. Это профессиональная практика без права на компромисс - один проект, одно окружение, воспроизводимое один в один на любой машине.

BASH
python -m venv .venv
source .venv/bin/activate
# On Windows:
# .venv\Scripts\activate
python -m pip install requests
python -m pip list
Создай, активируй и наполни виртуальное окружение

Чтобы установка была воспроизводимой, зафиксируй версии. pip freeze выгружает всё окружение, включая транзитивные зависимости, с точными версиями: максимум воспроизводимости, мучительные обновления. Современный подход разделяет две потребности: прямые зависимости объявляются в pyproject.toml со свободными ограничениями, а lock-файл генерируется для точной установки. В масштабе небольшого проекта requirements.txt остаётся вполне достойным вариантом.

BASH
python -m pip freeze > requirements.txt
# On another machine:
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
Зафиксируй, затем восстанови окружение один в один

Что до структуры, эталон - это src layout: код лежит в src/<package>/, тесты в tests/, конфигурация в pyproject.toml. Смысл папки src не косметический: она не даёт случайно импортировать локальный пакет из текущей директории, что скрыло бы ошибки упаковки - твои тесты работают с реально установленным пакетом. Во время разработки pip install -e . ставит проект в редактируемом режиме.

BASH
mkdir -p src/billing tests
touch src/billing/__init__.py
touch src/billing/invoices.py
touch tests/test_invoices.py
touch pyproject.toml README.md .gitignore
echo ".venv/" >> .gitignore
Скелет проекта в src layout

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Что гарантирует виртуальное окружение?
    • Более быстрое выполнение кода на Python
    • Изолированные зависимости для каждого проекта
    • Совместимость между версиями Python
    • Шифрование установленных пакетов
  2. Что содержит requirements.txt, сгенерированный командой pip freeze?
    • Только твои прямые зависимости
    • Все установленные зависимости, включая точные версии
    • Список пакетов, доступных на PyPI
  3. Почему стоит предпочесть python -m pip install команде pip install?
    • Это единственный синтаксис, который принимается внутри venv
    • Команда обращается к pip активного интерпретатора
    • Установка проходит быстрее