Как управлять зависимостями Python в виртуальном окружении на сервере?

Виртуальное окружение Python изолирует зависимости одного приложения от системного Python и других проектов. На сервере обычно создают .venv рядом с приложением, фиксируют зависимости в requirements-файле или lock-файле и запускают сервис через абсолютный путь к Python или Gunicorn внутри этого окружения.
Подробный ответ

Зачем нужно virtualenv

Виртуальное окружение изолирует Python-пакеты приложения. Это позволяет разным проектам использовать разные версии библиотек и не изменять системные пакеты Python через sudo pip.

Создание окружения

cd /srv/my-app
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip

После активации python и pip указывают на интерпретатор и пакеты из .venv. Выйти из окружения можно командой deactivate.

Установка фиксированных зависимостей

.venv/bin/python -m pip install --requirement requirements.txt
.venv/bin/python -m pip freeze > requirements.txt

Для production важна воспроизводимость: лучше фиксировать версии зависимостей или использовать lock-файл инструмента управления зависимостями. Это снижает риск, что новый деплой установит неожиданную несовместимую версию библиотеки.

Обновление зависимостей

Зависимости не стоит обновлять прямо на production-сервере без проверки. Правильнее обновить их в development, прогнать тесты, собрать артефакт или image в CI и деплоить уже проверенную версию.

.venv/bin/python -m pip list --outdated
.venv/bin/python -m pip check

Использование в systemd

Systemd не требует активации virtualenv через source. Нужно указывать полный путь к команде из окружения.

[Service]
WorkingDirectory=/srv/my-app
ExecStart=/srv/my-app/.venv/bin/gunicorn config.wsgi:application --bind 127.0.0.1:8000
EnvironmentFile=/etc/my-app/my-app.env

Практические правила

  • не использовать sudo pip install для зависимостей проекта;

  • использовать python -m pip, чтобы pip соответствовал нужному Python;

  • не коммитить сам каталог .venv в Git;

  • проверять зависимости через тесты и vulnerability scan до деплоя;

  • создавать новое окружение или обновлять его контролируемым deploy-скриптом.

Как ответить на собеседовании

На сервере я создаю отдельное .venv для приложения и ставлю пакеты через .venv/bin/python -m pip install -r requirements.txt. Версии зависимостей фиксирую в requirements или lock-файле. В systemd указываю полный путь к Gunicorn или Python внутри virtualenv и не использую sudo pip для зависимостей приложения.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге