Crontab выполняет скрипт на python, но что-то не так

#python #dictionary #cron #pygame

#python #словарь #cron #pygame

Вопрос:

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

Я запускаю скрипт pygame в качестве запланированной задачи в crontabs. У меня есть один код, который успешно выполняется и делает то, что должен. У меня есть другой код, который выполняется, но когда он выполняется, экран становится пустым, обычно отображая некоторые строки, которые я обычно вижу при загрузке Linux, и он просто остается там застрявшим.

Я просмотрел оба кода, и абсолютно все похоже и правильно. У меня есть #!/usr/bin/env python в начале каждого скрипта. (В другом месте было рекомендовано, чтобы я привел точную версию, потому что я использую словари в своем скрипте, и, по-видимому, crontab может запутаться в словарном материале, который использует pygame. Я не совсем понимаю, я пробовал, но это не сработало на моем Raspberry pi, поэтому я не думаю, что это решение.)

Каждый скрипт отлично работает в терминале.

Я установил переменную PATH в ту, которую использует скрипт python, а также установил ОБОЛОЧКУ в /bin/bash . В задаче у меня также есть «export DISPLAY =:0» (например 12 21 * * * экспорт ОТОБРАЖЕНИЯ =:0 amp;amp; …). Я обнаружил, что это был волшебный трюк, который заставил работать другой код. Что заставило меня задуматься, есть ли другая переменная среды, которую мне нужно установить в задаче?

Разница между первым кодом и вторым кодом: второй код использует pygame.mixer и воспроизводит звуковые файлы. В скрипте звуковые файлы находятся в словарях (например, sound = {«word»: «/ absolute/path/to/file.wav», «word2»: … etc} Как я уже сказал, этот код отлично работает в терминале.

Итак, почему один скрипт работает, а другой нет. Оба используют pygame. Другой просто использует звук, словари вместо строк, а также pygame.mixer. Я считаю, что существует проблема с тем, что crontab застревает на одной из этих вещей.

Комментарии:

1. запишите некоторую информацию в файл, который покажет вам, какая часть кода выполняется и / или что у вас есть в переменных. Напишите также сообщения от try/except . Возможно, таким образом вы обнаружите, в чем проблема. Обычно скрипты в crontab создают проблему, потому что они могут запускаться с разными привилегиями (без доступа к некоторым папкам), поскольку другой пользователь запускается в другой папке (поэтому они не могут найти другие файлы)

2. А также предложения @furas — эта диагностическая деталь также сузит проблему таким образом, что stackoverflow будет легче помочь. Вывод сведений об окружающей среде в журнал — переменные среды, время выполнения и т. Д. — Также может помочь, Поскольку скрипт работает нормально, когда не через cron.

3. Я взял старый скрипт (который работает в Crontab) и попытался добавлять вещи шаг за шагом, проверяя каждый его шаг в Crontab. Кажется, что когда я добавляю строку ‘pygame.mixer.init()’, Crontab больше не может ее запускать. Или, если я просто попытаюсь добавить ‘pygame.mixer.music.load («/ path/ to/file.wav»)’, а затем ‘pygame.mixer.music.play (1)’, он также зависает в Crontab. Я думаю, что он изо всех сил пытается получить звуковой файл, как вы сказали, может быть, у него нет доступа к папкам? Как проверить, является ли это проблемой? Как мне это исправить?

Ответ №1:

Я это исправил. Я запускал его из root. Когда я запустил crontab у пользователя, он сработал. Должно быть, это потому, что корень не смог получить доступ к файлам. Важные советы — добавить «импортировать ОС» и в какой-то момент в сценарий добавить «print (os.environ)», чтобы проверить все переменные среды при запуске в терминале. Затем скопируйте переменные $PATH в начало заданий crontab. То же самое с $SHELL . Переменные $DISPLAY необходимо поместить в строку, например, ‘* * * * * export DISPLAY=:0 amp;amp; /usr/bin/python /home/user/file.py «Посмотрите, как я указываю абсолютные пути как для команды, так и для пути к файлу. Я также устанавливаю абсолютные пути к файлам в скрипте, даже если файлы находятся в той же папке, что и скрипт. Я не уверен, что это необходимо, я проверю это следующим. Я видел, как многие люди боролись с этой проблемой, и советы обычно сводятся к этим вещам.