Попытка запустить скрипт Python при загрузке на Raspberry Pi 3B + 1GB RAM, Raspbian, с SunFounder 10 "Сенсорный экран, - файл .log возвращает" Неверное отображаемое имя "
Скрипт Python на 100% функционален при запуске через Терминал / исполняемый скрипт / Тонни и т. Д. Попытка запустить сначала при загрузке через rc.local - создана служба, включена служба, перезагрузка демона ... и т. Д. Не сработало. Пытался запустить как crontab, результат тот же - вывод .log из crontab показывает «Неверное отображаемое имя». Думал, что это отсутствие Display Environment, импортированного и объявленного в скрипте Python, поэтому я добавил это, но при загрузке возвращает тот же результат.
Это скрипт Python, который я использую
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import os
import sys
import webbrowser
import time
import subprocess
from pynput import keyboard
from Xlib.display import Display
#GPIO Readout
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#GPIO Header Setup
header = 2
GPIO.setup(header, GPIO.IN)
#Omxplayer Commands
Loop = 'omxplayer -b --loop --no-osd -o hdmi /home/pi/Videos/PlanetEarth.mp4 > /dev/null'
Donation = 'omxplayer -b --no-osd -o hdmi /home/pi/Videos/Cartoon.mp4 > /dev/null'
KillPlayer = 'pkill omxplayer.bin'
KillForm = 'pkill chromium'
#Set Display Environment
new_env = dict(os.environ)
new_env['DISPLAY'] = ':0.0'
#Form Handling Required Below
#If Donation is successful, Stop Looping Video, Open Form in Chromium, Wait 60 seconds, Close Chromium, Restart Loop
def PullDownSuccess():
subprocess.Popen(KillPlayer, env=new_env, shell=True)
time.sleep(2)
webbrowser.open('<url>')
time.sleep(60)
subprocess.Popen(KillForm, env=new_env, shell=True)
time.sleep(2)
subprocess.Popen(Loop, env=new_env, shell=True)
#Inception
subprocess.Popen(Loop, env=new_env, shell=True)
#Terminate Loop with Escape Key or Manually Initiate Donation Success
def on_press(key):
if key == keyboard.Key.ctrl:
PullDownSuccess()
if key == keyboard.Key.esc:
subprocess.Popen(KillPlayer, shell=True)
#Keyboard Listener Module
with keyboard.Listener(
on_press=on_press) as listener:
listener.join()
#Donation Successful Do:
while True:
header_state = GPIO.input(header)
if header_state == GPIO.HIGH:
PullDownSuccess()
В настоящее время я пытаюсь запустить этот скрипт при загрузке через crontab со следующей строкой:
@reboot (/bin/sleep 10; /usr/bin/python3 /home/pi/Custom_Scripts/<script>.py > /home/pi/Custom_Scripts/cronjoblog 2>&1)
Файл журнала ошибок для crontab возвращает следующее:
raise error.DisplayNameError(display)
Xlib.error.DisplayNameError: Bad display name ""
Эта ошибка возникает только при попытке запустить сценарий при загрузке. Отменяет ли дисплей разрешения загрузочного дисплея при загрузке? Что мешает запуску сценария на дисплее при загрузке, но не при удаленном выполнении? Спасибо за внимание.
Обновление: по-прежнему нет решения. Среда отображения возвращает ": 0,0 '... пока я пытался удалить
> /dev/null from #Omxplayer Commands
Замена строки запуска crontab на:
DISPLAY=":0" /usr/bin/python3 /home/pi/Custom_Scripts/<script>.py
а также
DISPLAY=":0.0" /usr/bin/python3 /home/pi/Custom_Scripts/<script>.py
И любое их сочетание.
Подтверждено, что скрипт не ожидает каких-либо фоновых процессов, поскольку я добавил задержку (time.sleep) до 30 секунд, а также возвращал IP-адреса и т. Д.
Возвращает либо неверное отображаемое имя, либо "Невозможно подключиться к дисплею": 0 ": b'Неверный ключ MIT-MAGIC-COOKIE-1"
Все еще ищу решение, если оно у кого-то есть.
РЕДАКТИРОВАТЬ: Исправлено с использованием / LXDE-pi / autostart. Ответ ниже.