Crontab выполняет скрипт Python, но что-то не так - PullRequest
0 голосов
/ 16 апреля 2019

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

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

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

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

Я установил переменную PATH на ту, которую использует скрипт python, а также установил для SHELL значение / bin / bash. В задаче у меня также есть «export DISPLAY =: 0» (например, 12 21 * * * export DISPLAY =: 0 && ...). Я обнаружил, что это был магический трюк, который заставил другой код работать. Что заставило меня задуматься, есть ли другая переменная среды, которую мне нужно установить в задаче?

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

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

1 Ответ

0 голосов
/ 19 апреля 2019

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

...