Jetson Nano开机自启动脚本中OpenCV imshow窗口无法显示求助
问题描述
运行Ubuntu 18.04的Jetson Nano,尝试创建开机自启动脚本实现图片显示(后续计划扩展到摄像头视频流),遇到以下问题:
- 手动在终端运行脚本时,图片正常显示,按下ESC键后会生成指定TXT文件,全程逻辑正常。
- 开机自启动时,
cv2.imshow()窗口完全不显示,按下ESC键后后续代码也无法执行;注释掉图形显示相关代码后,脚本能正常完成所有逻辑。 - 更换PIL、Matplotlib等其他图形显示库,问题同样存在,并非OpenCV特有。
测试核心脚本逻辑:
from os.path import expanduser import datetime import cv2 img = cv2.imread('/home/sam/Documents/2022-08-31-220946_4.jpg') window_name = 'test_img' cv2.imshow(window_name,img) while True: k = cv2.waitKey(0) & 0xFF if k==27: break cv2.destroyAllWindows() # 后续文件写入逻辑 file = open(expanduser("~") + '/Desktop/i_was_created.txt', 'w') file.write("This LinuxShellTips Tutorial Actually worked!\n" + str(datetime.datetime.now())) file.write('OpenCV Version: {}\n'.format(str(cv2.__version__))) file.close()
问题原因
开机自启动脚本默认运行在无X11桌面会话绑定的环境中:
- OpenCV、PIL等图形界面库依赖X服务器渲染窗口,系统开机启动阶段(或系统级启动任务)未加载桌面会话,没有可用的DISPLAY环境变量,导致无法创建显示窗口。
- 脚本执行到
cv2.waitKey(0)这类等待用户输入的函数时,因没有实际交互窗口,程序会陷入无限等待,后续代码无法执行。
解决方法
1. 绑定DISPLAY环境变量
在Python脚本开头添加环境变量指定,强制绑定当前桌面的X显示会话:
import os # 指定DISPLAY为桌面默认的:0(可在终端执行`echo $DISPLAY`确认) os.environ['DISPLAY'] = ':0' os.environ['XAUTHORITY'] = '/home/sam/.Xauthority' # 替换为你的用户目录
2. 使用桌面级启动项
优先选择桌面级启动方式,避免系统级启动的环境缺失问题:
- 打开Ubuntu的「Startup Applications」(启动应用程序),添加新启动项:
- 名称:自定义(如Image Display Test)
- 命令:
python3 /home/sam/path/to/your/script.py - 注释:开机显示测试图片
- 该方式会在桌面环境完全加载后执行脚本,自动继承桌面的DISPLAY环境变量。
3. 若使用systemd服务(系统级启动)
如果必须用systemd管理启动脚本,创建或修改service文件(比如/etc/systemd/system/img-display.service):
[Unit] Description=Startup Image Display Test After=graphical.target # 确保在桌面环境启动后再运行 [Service] User=sam # 替换为你的用户名 Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/sam/.Xauthority" ExecStart=/usr/bin/python3 /home/sam/path/to/your/script.py Type=simple [Install] WantedBy=graphical.target
执行命令启用服务:
sudo systemctl daemon-reload sudo systemctl enable img-display.service
4. 验证修复效果
在终端模拟无桌面会话的环境运行脚本,确认修复有效:
su - sam -c "DISPLAY=:0 python3 /home/sam/path/to/your/script.py"
内容的提问来源于stack exchange,提问作者Sam Skinner
相关产品推荐
相关产品推荐

