У меня есть простой графический интерфейс (созданный с помощью tkinter), который я хочу запускать в определенное время дня на Raspberry pi 3. Bellow - это фрагмент кода, который я использовал в crontab. Я вызвал менеджер crontab с помощью sudo crontab -e.
0 18 * * * cd /home/pi/gui && python3 gui.py
На данный момент я могу запустить графический интерфейс, вызвав его напрямую через командную строку Pi. Однако это не работает, когда я пытаюсь сделать это с помощью cron. Я также попытался переключиться на базовый скрипт Python (запись в файл), и это сработало. Есть ли какое-то странное взаимодействие, о котором мне нужно знать?
Моя настройка: raspberry pi 3, python 3, raspi-screen, tkinter (последняя версия, насколько мне известно)






Судо будет работать без tty и отображаться, поэтому ваша команда не будет работать.
Попробуйте установить xvfb и использовать
0 18 * * * cd /home/pi/gui && xvfb-run python3 gui.py
Обновление-1: 22-июн-18
Если вы хотите использовать свой фактический дисплей, вам необходимо убедиться, что вы используете команду ниже
XAUTHORITY=/home/<user>/.Xauthority DISPLAY=:0 python3 gui.py
А также убедитесь, что cron предназначен для вашего пользователя. DISPLAY по умолчанию - :0.
Когда у вас есть XServer (графический интерфейс), вы не можете просто подключиться к нему без авторизации. При запуске системы создается файл, и это местоположение сохраняется в переменной окружения XAUTHORITY.
Когда вы запускаете cron, у вас есть ограниченные переменные среды. Нет существующих XAUTHORITY или DISPLAY, определенных
чтобы иметь возможность подключиться к нужному дисплею. Итак, вам нужно определить каждую переменную среды, которая потребуется вашей программе.
Итак, вы определяете DISPLAY=:0 для выбора дисплея по умолчанию, и вам нужно установить XAUTHORITY=/home/<user>/.Xauthority, чтобы подтвердить, что вы авторизованы для подключения к дисплею.
это сработало для меня, добавив путь к python: / usr / bin / pýthon3 /path_to_file/my_file.py, возможно, поможет кому-то эта информация
Raspbian 10 (buster): единственной недостающей частью - в моем случае - было сообщить cron-job с помощью gtk, какой дисплей он должен использовать, вставив
DISPLAY=:0. Я использовал bash-скрипт, чтобы запустить python-скрипт с помощью tk; Это также может быть скрипт на Python.
@reboot DISPLAY=:0 /home/pi/path/to/my/script.sh start
Полезно для отладки:
@reboot DISPLAY=:0 /home/pi/path/to/my/script.sh start >> home/pi/Desktop/cron.log (в одну строку)
Используя cron в качестве пользователя pi (а не root), необходимо было поместить файл cron.log в какую-нибудь папку /home/pi/..., чтобы предоставить доступ на запись в файлы журнала.
Возможно, Raspbian нужно время, чтобы все настроить, прежде чем приложение сможет быть запущено; Я использовал:
@reboot sleep 10 && DISPLAY=:0 /home/pi/path/to/my/script.sh start
Вместо @reboot можно использовать обычные настройки cron, например:
*/5 * * * * (остальная часть строки см. Выше)
каждые 5 минут до запуска.
Привет! Я все еще получаю сообщение об ошибке при использовании вашего метода: _tkinter.TclError: не удалось подключиться к отображению ": 0"
Обычно я работаю в «безголовой» среде; то есть RPi3 подключен к локальной сети через кабель Ethernet, VNC включен в raspisetup, а удаленный рабочий стол, например, VNC или другой клиент показывает экран RPi на экране ПК. Возможно, ваш графический дисплей подключен к другому, например. : 1 или: 2. Кто-нибудь знает, как определить активный номер дисплея или имя?
Позвольте нам продолжить обсуждение в чате.