使用触摸屏启动 运行 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
尝试在 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