Пара 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
Практика: Один код, два запуска
- Запустите StudyPulse локально и проверьте /healthz.
- Отправьте POST /predict с hours=4 через пример из lab/README.md.
- Остановите сервис; измените PORT и MODEL_VERSION только через окружение.
- Передайте недопустимый 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 — метка запуска, а коэффициент вычисления берётся из артефакта.
Основные выводы
- Python-окружение и библиотеки, а не ядро, сеть или права ОС.
- Связывает менеджер пакетов с выбранным интерпретатором.
Самостоятельная работа
Написать README запуска и перечислить все настройки StudyPulse.