Пара 8: Пакеты, зависимости, Python и конфигурация

90 минут · 3 курс, ML.

Содержание и результат

Создать venv, запустить StudyPulse и отделить конфигурацию от исходного кода.

План занятия

0–10: контекст и исходная задача. 10–40: устройство и механизмы. 40–55: демонстрация команд. 55–80: лабораторная работа. 80–90: разбор результата и фиксация исправлений.

Практика выполняется в своей учебной папке и на localhost. Подготовка окружения описана в lab/README.md.

Пакеты ОС и библиотеки проекта

apt и pip управляют разными слоями.

apt устанавливает системные пакеты Ubuntu из настроенных репозиториев. apt update обновляет сведения о доступных версиях, а не все программы. pip устанавливает Python-пакеты в выбранное окружение. Системный Python нужен Ubuntu; не меняем его через sudo pip. Для проекта создаём .venv и используем python -m pip, чтобы пакетный менеджер относился к тому же интерпретатору. В нашем базовом сервисе достаточно стандартной библиотеки; дополнительные инструменты вводим только ради задачи. Закреплённые версии зависимостей и проверяемый источник важны для воспроизводимости, но не заменяют обновления безопасности.

Аналогия: ремонт здания и инвентарь отдельной лаборатории имеют разных владельцев.

Виртуальное окружение

venv изолирует Python-библиотеки, но не всю ОС.

python3 -m venv .venv создаёт окружение. source .venv/bin/activate меняет PATH текущего shell; отдельный терминал не активируется автоматически. Прямой вызов .venv/bin/python работает и без активации, поэтому удобен для служб. Проверяем sys.executable и which python. venv не контейнер: оно не изолирует сеть, процессы и права файлов. Папку .venv не коммитим; её восстанавливают из описания зависимостей. Это первый пример принципа «храним рецепт, а не случайную среду». Не объясняем ошибки импортов переустановкой всего Python без проверки пути.

Аналогия: разные ящики инструментов в одной мастерской.

Код, конфигурация, артефакт

Меняем поведение без редактирования программы под каждый ноутбук.

HOST, PORT, MODEL_VERSION и MODEL_PATH — настройки учебного сервиса. Значения переменных окружения являются строками и требуют проверки. Порт должен быть допустимым числом, версия — ограниченной безопасной меткой. Файл модели в курсе — маленький JSON с коэффициентом; он иллюстрирует версионирование артефакта и не является обученной ML-моделью. Конфигурация выбирает местоположение, приложение проверяет формат. Переменная окружения сама по себе не делает пароль защищённым: её могут видеть привилегированные процессы и диагностические инструменты. В учебных данных не должно быть персональной информации.

Аналогия: рецепт, настройки духовки и партия ингредиентов.

Подробный разбор: Пакеты, зависимости и совместимая конфигурация

Менеджер пакетов связывает версии зависимостей

Пакеты системы, Python venv и контейнерный образ управляют разными слоями.

Менеджер пакетов связывает версии зависимостей

Apt получает metadata репозитория, проверяет доступные пакеты и решает dependencies; dpkg устанавливает отдельный deb, но не заменяет всей логики репозитория. Системный Python, libc и утилиты принадлежат пакетной системе, поэтому sudo pip способен нарушить ожидаемые версии. Venv отделяет Python-пакеты проекта, но не создаёт другую Linux libc. Pip freeze фиксирует часть Python-среды, а не версию ядра и системных библиотек. Контейнерный образ фиксирует пользовательскую среду иначе, но разделяет ядро хоста. Неправильный файл .so или пакет из другого дистрибутива может привести к missing symbols и ABI errors. Сначала определяют, какой компонент и runtime действительно запускаются: command -v, python -c import sys, file/readelf, package ownership. В конфигурации используют абсолютные пути, очевидную рабочую папку и явно заданные переменные, особенно при переходе к systemd.

Практическое следствие: Ремонт dependency начинается с определения активного interpreter и источника пакета, а не с установки всего подряд.

Опыт: связать рисунок с наблюдением

command -v python3
python3 -c 'import sys; print(sys.executable); print(sys.version)'
dpkg -S /usr/bin/ls
apt-cache policy python3
python3 -m venv .venv
.venv/bin/python -c 'import sys; print(sys.executable)'

Сравните системный interpreter и .venv; не меняйте системные пакеты через pip. На Mac package manager и ownership-команды отличаются.

Источники подробного разбора

Команды и наблюдения

Окружение: Ubuntu / Bash, папка lab из комплекта.

sudo apt update
sudo apt install -y python3-venv curl git
cd ~/devops-course/lab
python3 -m venv .venv
.venv/bin/python -c "import sys; print(sys.executable)"
HOST=127.0.0.1 PORT=8000 MODEL_VERSION=v1 .venv/bin/python app.py
# In another terminal
curl -i http://127.0.0.1:8000/healthz

Скопируйте предоставленную папку lab в ~/devops-course/lab заранее. apt требует sudo, сам сервис — нет.

Ожидаемый результат: Сервис возвращает JSON со status=ok и model_version=v1; путь интерпретатора находится в .venv.

Вариант для macOS

Установите поддерживаемый Python из python.org; если Homebrew уже выбран и установлен, допустим brew install python git. apt на macOS отсутствует. venv и конфигурация курса работают одинаково; не используйте sudo pip для системной среды.

python3 --version
python3 -m venv .venv
.venv/bin/python -c "import sys; print(sys.executable)"
HOST=127.0.0.1 PORT=8000 .venv/bin/python app.py

Практика: Один код, два запуска

  1. Запустите StudyPulse локально и проверьте /healthz.
  2. Отправьте POST /predict с hours=4 через пример из lab/README.md.
  3. Остановите сервис; измените PORT и MODEL_VERSION только через окружение.
  4. Передайте недопустимый PORT и объясните, почему ранний отказ лучше странного поведения.

Результат: Два ответа /healthz и запись проверки неверной конфигурации.

Проверка: Исходный app.py не редактируется ради порта; неверная конфигурация не запускается.

Неисправность для разбора: pip и python относятся к разным окружениям.

Решение и диагностика

Используйте PORT=8001 MODEL_VERSION=v2 .venv/bin/python app.py; затем curl http://127.0.0.1:8001/healthz. POST: curl -i -H "Content-Type: application/json" -d '{"hours":4}' http://127.0.0.1:8001/predict. Значение PORT=nope должно приводить к явной ошибке конфигурации. Версия в healthz — метка запуска, а коэффициент вычисления берётся из артефакта.

Основные выводы

Самостоятельная работа

Написать README запуска и перечислить все настройки StudyPulse.

Источники