Когда Python скрипт не запускается на сервере, локально он может работать идеально, а на VPS падать без понятного сообщения. Причина почти всегда в окружении.

Так могут остановиться парсеры, рассылки, интеграции, отчеты, обработка файлов и любые автоматические задачи, которые должны работать по расписанию.

Коротко: нужно проверить интерпретатор, virtualenv, зависимости, права, рабочую директорию и логи запуска.

Почему это ломается

Скрипт не стартует из-за другой версии Python, отсутствующих pip-пакетов, неактивированного venv, неправильного shebang, запрета на выполнение файла, относительных путей, отсутствующих env-переменных или запуска из cron с другой директорией.

Что проверяю в первую очередь

  • какой python запускается на сервере
  • установлены ли зависимости в нужном окружении
  • есть ли права на запуск и чтение файлов
  • что пишет скрипт при ручном запуске
  • как он запускается из cron или systemd

Как я это чиню

Я сначала запускаю скрипт вручную тем же пользователем и тем же Python, которым он должен работать в автоматическом режиме.

  • настраиваю virtualenv и зависимости
  • исправляю пути и рабочую директорию
  • добавляю env-переменные в cron или systemd
  • настраиваю права файлов и папок
  • добавляю логирование stdout и stderr

Что подготовить перед обращением

  • сам скрипт или путь к нему
  • как его нужно запускать
  • текст ошибки
  • доступ к серверу
  • список нужных внешних сервисов или файлов

Как выглядит нормальный результат

Скрипт должен запускаться вручную и по расписанию одинаково, писать понятные логи и не зависеть от случайного окружения shell-сессии.

Чего лучше не делать

Не устанавливайте пакеты глобально без необходимости. Лучше использовать отдельное окружение проекта, чтобы не ломать другие скрипты.

Вопросы и ответы

Почему в терминале работает, а cron нет?

Cron запускается с другим окружением, путями и переменными. Нужно прописывать абсолютные пути и env.

Что лучше: cron или systemd timer?

Для простых периодических задач достаточно cron, для долгих сервисов лучше systemd.

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

Да, лучше делать отдельные virtualenv для разных проектов.

Почему ошибка ModuleNotFoundError?

Пакет установлен не в том окружении или скрипт запускается другим Python.

Нужна похожая задача?

Напишите в Telegram @rabotator_support или оставьте заявку на сайте. Коротко опишите проблему, приложите ссылку, скриншот или лог ошибки, и я подскажу, с чего безопасно начать исправление.

Итог

Python на сервере требует воспроизводимого окружения: интерпретатор, venv, зависимости, пути, права и логи должны быть заданы явно.