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