Python Linux

Python: ModuleNotFoundError возникает только при запуске скрипта через cron

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

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

В этой статье
  1. Что происходит и как распознать неисправность
  2. Как отличить причины
  3. Пошаговая диагностика и исправление
  4. Команды и примеры для проверки
  5. Как проверить результат и что делать дальше

#Что происходит и как распознать неисправность

Сообщение ModuleNotFoundError появляется только в задании cron на Linux. Интерактивная оболочка может активировать .venv и задавать рабочий каталог, а cron запускает команду с ограниченным окружением и от другого пользователя. Не путайте этот сценарий с отсутствием пакета во всех способах запуска.

#Как отличить причины

Возможная причинаКак узнатьЧто делать
Другой Pythoncron запускает системный python3 вместо интерпретатора проекта.В терминале после активации .venv модуль импортируется, по расписанию — нет.Укажите абсолютный путь к python из .venv.
Иной рабочий каталогОтносительные пути и локальные импорты зависят от каталога процесса.Ошибка возникает для собственного пакета проекта или файла рядом со скриптом.Перейдите в каталог проекта до запуска.
Другая учётная запись или окружениеcron пользователя и системное задание используют разные права и переменные.Пакет есть только в окружении другого пользователя.Сверьте владельца задания и файлов, а не устанавливайте всё от root.

#Пошаговая диагностика и исправление

  1. Сначала воспроизведите ошибку вручнуюОткройте терминал Linux под владельцем задания: в меню приложений найдите «Терминал» или подключитесь к серверу по SSH. Перейдите в каталог проекта и выполните ту же команду, что записана в cron. Запишите полный traceback и имя отсутствующего модуля. Если ошибка проявляется и вручную, сначала исправьте сам импорт; cron здесь ни при чём.
  2. Проверьте, где находится заданиеВ терминале выполните crontab -l без sudo: это личное расписание текущего пользователя. Посмотрите строку запуска и имя скрипта. Если строки нет, задание может принадлежать другой учётной записи или быть в /etc/crontab либо /etc/cron.d/; для чужого расписания попросите администратора. Перед редактированием скопируйте исходную строку в безопасное место.
  3. Найдите настоящий интерпретатор проектаВ каталоге проекта активируйте окружение обычным для него способом, затем выполните python -c "import sys; print(sys.executable)". Вы получите абсолютный путь наподобие /srv/app/.venv/bin/python. Сравните его с python3 в расписании. Если .venv отсутствует, сначала выясните, где создано окружение; не устанавливайте пакеты в системный Python вслепую.
  4. Проверьте модуль именно в выбранном PythonВызовите /путь/к/проекту/.venv/bin/python -m pip show ИМЯ_ПАКЕТА, заменив все условные части реальными значениями; затем проверьте импорт коротким запуском данного Python. Если pip сообщает Package(s) not found, проверьте наличие зафиксированного requirements.txt и установите зависимости только в этот venv. Имя пакета для pip может отличаться от имени модуля для import.
  5. Исправьте путь и каталог в записи cronОткройте расписание командой crontab -e для того же пользователя. Вместо python script.py используйте конструкцию cd /абсолютный/каталог/проекта && /абсолютный/каталог/проекта/.venv/bin/python /абсолютный/каталог/проекта/script.py. Путь меняйте на действительный; пробелы в путях требуют аккуратного экранирования или кавычек. Сохраните файл редактора; если редактор сообщает об ошибке формата расписания, исправьте её перед выходом.
  6. Сверьте права и зафиксируйте вывод без секретовПроверьте, что пользователь cron может читать скрипт, .venv, каталоги и нужные файлы; не применяйте chmod 777. При необходимости временно направьте стандартную ошибку в отдельный доступный журнал, например добавьте к строке >> /путь/к/проекту/cron-debug.log 2>&1, если журнал не содержит токенов. Если записи нет, проверьте работу службы планировщика у администратора.
  7. Проверьте срабатывание и отмените тестовые измененияЗапустите исправленную команду вручную без активации окружения и дождитесь ближайшего штатного времени cron; в журнале не должно быть ModuleNotFoundError. Удалите временное перенаправление вывода и восстановите исходную строку из копии, если после изменений ситуация стала хуже. Если проблема осталась, передайте администратору точную строку cron без секретов и traceback.

#Команды и примеры для проверки

Linux · Терминал (Bash)Команда
Выполнять в терминале под владельцем расписания; обе команды только показывают настройки. Python в cron может быть другим.
crontab -l
python3 -c "import sys; print(sys.executable)"
Linux · Терминал (Bash)Команда
Установку пакетов эта команда не выполняет; показывает Python, к которому привязан pip.
python3 -m pip --version

#Как проверить результат и что делать дальше

Успех означает, что тот же Python и зависимости используются при ручном запуске и по расписанию, а лог не содержит ModuleNotFoundError. Если ошибка появляется только на сервере, сравните версии Python, пользователя задания и доступность смонтированных каталогов. Токены окружения и содержимое закрытых файлов в отчёт не вставляйте.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.