使用触摸屏启动 运行 Python 脚本时显示名称错误

Bad Display Name when running Python script on boot with Touch Screen

尝试在 Raspberry Pi 3B+ 1GB RAM,Raspbian 上启动 运行 脚本 Python,带有 SunFounder 10" Touch Screen,-.log 文件 returns "错误的显示名称'

Python 脚本在通过终端/可执行脚本/Thonny 等 运行 时 100% 起作用。尝试通过 rc.local 在启动时首次 运行 - 创建了一个服务,启用的服务,守护程序重新加载...等。没有工作。 尝试将 运行 作为 crontab,结果相同 - crontab 的 .log 输出显示 "Bad display name"。认为是缺少在 Python 脚本中导入和声明的显示环境,所以我添加了 - 但在启动时 returns 结果相同。

这是我正在使用的 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 returns 的错误日志文件如下:

    raise error.DisplayNameError(display)
Xlib.error.DisplayNameError: Bad display name ""

此错误仅在尝试 运行 启动脚本时存在。显示器是否会在启动时覆盖启动显示权限?是什么让 运行ning 脚本在启动时显示在显示器上,但在远程执行时却没有?感谢您的考虑。


更新:仍然没有解决方案。 显示环境 returns ":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

以及这些的任何可能组合。

确认脚本没有等待任何后台进程,因为我添加了最多 30 秒的延迟 (time.sleep),以及返回 IP 地址等

Returns 仍然显示名称错误或 "Can't connect to display ":0": b'无效 MIT-MAGIC-COOKIE-1 密钥"

如果有人有解决方案,仍在寻找解决方案。

编辑: 使用 /LXDE-pi/autostart 修复。在下面回答。

尝试在调用脚本之前添加 DISPLAY 环境变量:

DISPLAY=":0" /usr/bin/python3 /home/pi/Custom_Scripts/<script>.py

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

你有没有试过更长的睡眠时间?

如果您尝试在启动脚本期间获取您的 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]

您将收到如下错误:

File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
error: [Errno 101] Network is unreachable

这是因为重启时网络不一定可用。为了使其可用 见 https://raspberrypi.stackexchange.com/questions/45769/how-to-wait-for-networking-on-login-after-reboot :

sudo raspi-config

然后 select 选项 3 引导选项 然后 select 选项 4 Wait for network at boot

完成后,重新启动时网络应该不会成为问题。

在 运行 您的脚本查看之前,您还可以检查其他方式来强制执行网络设置: https://askubuntu.com/questions/3299/how-to-run-cron-job-when-network-is-up

如果使用此方法有不可预见的后果,我将相应地更新此线程。我只是通过向 /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