Неверное отображаемое имя при запуске скрипта Python при загрузке с сенсорным экраном

Попытка запустить скрипт 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. Ответ ниже.


person Kaeosm    schedule 18.09.2019    source источник


Ответы (4)


Попробуйте добавить переменную окружения DISPLAY перед вызовом скрипта:

DISPLAY=":0" /usr/bin/python3 /home/pi/Custom_Scripts/<script>.py
person ipaleka    schedule 18.09.2019
comment
Спасибо за ваш вклад. DISPLAY=":0" /usr/bin/python3 /home/pi/Custom_Scripts/<script>.py Это возвращает: Невозможно подключиться к дисплею: ​​0: b'Неверный ключ MIT-MAGIC-COOKIE-1 ' - person Kaeosm; 18.09.2019
comment
Что ж, я не могу пока помочь вам с этим, поскольку я создал проблему с таргетингом та же ошибка для моего проекта недавно. - person ipaleka; 18.09.2019
comment
Ха-ха ... ну, я дам тебе знать, что найду, если найду решение! - person Kaeosm; 18.09.2019
comment
Я использую монитор, подключенный через кабель VGA, и DISPLAY=":1" у меня работал, спасибо - person Josh; 03.07.2020

DISPLAY="/dev/null" /usr/bin/python3 /home/pi/Custom_Scripts/<script>.py

Вы пробовали спать дольше?

person theandrewlane    schedule 18.09.2019
comment
Пробовал более длительный сон, а также объявил DISPLAY = / dev / null - результат того же неверного отображаемого имени. - person Kaeosm; 20.09.2019

Если вы попытаетесь получить свой IP-адрес во время запуска сценария (например):

  import socket
  def get_ip_address():
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        return s.getsockname()[0]

вы получите ошибку вроде:

Файл "/usr/lib/python2.7/socket.py", строка 228, в методе
return getattr (self._sock, name) (* args)
ошибка: [Errno 101] Сеть недоступна

Это связано с тем, что при перезагрузке сеть не всегда доступна. Чтобы сделать его доступным, см. https://raspberrypi.stackexchange.com/questions/45769/how-to-wait-for-networking-on-login-after-reboot:

sudo raspi-config

затем выберите опцию 3 Boot Options, затем выберите опцию 4 Wait for network при загрузке

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

Вы также можете проверить другие способы принудительной настройки сети перед запуском вашего скрипта. Взгляните на: https://askubuntu.com/questions/3299/how-to-run-cron-job-when-network-is-up

person PilouPili    schedule 18.09.2019
comment
Спасибо за ваш вклад. Убедиться, что параметр загрузки настроен на ожидание сети, является хорошей практикой. Я изменил параметры загрузки, чтобы отразить ваше предложение. Однако это не решает проблему отображения. Есть ли у вас какие-либо данные о неверном отображаемом имени, которое существует при загрузке? - person Kaeosm; 19.09.2019
comment
Вы пытались включить get_ip_address() в свой скрипт python, чтобы убедиться, что вы получили правильный IP-адрес и работает ли ваша сеть? - person PilouPili; 20.09.2019
comment
Чтобы подшутить над вами - print (socket.gethostbyname (socket.gethostname ())) возвращает мой правильный IP - с моим сетевым подключением все в порядке. Сеть работает и на 100% до того, как все процессы моего скрипта будут успешно запущены. В сценарии ничего не делается по сети. Все работает локально. Есть ли причина отклониться от моего первоначального вопроса и темы? - person Kaeosm; 20.09.2019
comment
Потому что, когда я попытался воспроизвести вашу проблему, get_ip_address () дал мне указанную выше ошибку, а до этого у меня было Xlib.error.DisplayNameError: Bad display name. Поскольку DISPLAY используется сервером X11 для депортации DISPLAY, я подумал, что это проблема сети. Я включил сеть при загрузке и после этого больше не наблюдал никаких проблем с DISPLAY. Поэтому я подумал, что это ключ к решению вашей проблемы. Кажется, плохая догадка. Кстати, можете ли вы получить более подробную информацию об ошибке трассировки стека, это поможет? - person PilouPili; 20.09.2019
comment
Теперь я понимаю. Я ценю вас за такую ​​тщательность. Я попробую еще несколько методов и получу более подробную информацию об ошибке трассировки стека и скоро вернусь к вам. Постоянное спасибо. - person Kaeosm; 20.09.2019

Если возникнут непредвиденные последствия для использования этого метода, я соответствующим образом обновлю эту ветку. Я исправил эту проблему, просто добавив две строки в файл автозапуска, который находится в / etc / sdg / lxsession / LXDE-pi / autostart.

sudo nano /etc/xgd/lxsession/LXDE-pi/autostart

Добавьте эти две строки, не изменяя существующий код.

sleep 5
@/usr/bin/python3 /home/pi/Custom_Scripts/<script>.py

Мой файл автозапуска выглядит так:

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
point-rpi
sleep 5
@usr/bin/python3 /home/pi/Custom_Scripts/<script>/py

Ctrl + O для записи файла

sudo reboot
person Kaeosm    schedule 14.10.2019