You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派Stretch Lite下Pillow的Image模块无法在命令行显示图像

解决Pillow在树莓派Stretch Lite下调用fbi/fim显示图片的问题

我之前也碰到过一模一样的情况——在无X Server的树莓派Lite系统上,Pillow的show()方法根本没法正确调用fbi,哪怕命令行直接跑完全正常。核心问题在于Pillow的show()是为带桌面环境的系统设计的,默认会触发依赖X的工具,就算你指定了command='fbi',也会因为参数传递或终端环境的问题报错。

直接用subprocess替代Pillow的show()

最靠谱的方案是绕过Pillow的show(),直接用Python的subprocess模块调用fbi,这样能完全控制命令的执行方式,既避免阻塞脚本,也能避开X相关的错误。

示例代码

import subprocess
import os

# 获取当前终端(比如你切换到的alt-F2对应/dev/tty2,这里自动获取不用手动填)
current_tty = os.ttyname(0)
tty_number = current_tty.split('/')[-1]  # 从/dev/tty2提取出'2'

# 调用fbi在指定终端显示图片,后台运行不阻塞Python脚本
subprocess.Popen(
    ['fbi', '-T', tty_number, '-a', 'image1.jpg'],
    stdin=subprocess.DEVNULL,
    stdout=subprocess.DEVNULL,
    stderr=subprocess.DEVNULL,
    start_new_session=True
)

参数说明

  • -T <终端号>:指定fbi输出到哪个终端,比如alt-F1对应tty1,alt-F2对应tty2,自动获取能避免手动指定出错。
  • -a:让图片自动适应屏幕大小,不用手动调整显示比例。
  • stdin=subprocess.DEVNULL:阻止fbi等待用户按键输入(默认fbi会挂起等你按任意键退出),这样图片会一直显示,直到你手动关闭fbi进程。
  • start_new_session=True:让fbi脱离Python进程的控制,就算Python脚本执行结束,图片也能继续显示(可选,根据你的需求调整)。

如果需要图片自动退出

如果希望图片显示一段时间后自动关闭,给fbi加-t <秒数>参数即可:

subprocess.Popen(
    ['fbi', '-T', tty_number, '-t', '5', '-a', 'image1.jpg'],
    stdin=subprocess.DEVNULL,
    stdout=subprocess.DEVNULL,
    stderr=subprocess.DEVNULL
)

上面的代码会让图片显示5秒后自动退出,完全不会阻塞Python脚本的后续执行。

替换为fim的情况

如果想用fim替代fbi,参数逻辑完全一致,只需要把命令换成fim

subprocess.Popen(
    ['fim', '-T', tty_number, '-a', 'image1.jpg'],
    stdin=subprocess.DEVNULL,
    stdout=subprocess.DEVNULL,
    stderr=subprocess.DEVNULL,
    start_new_session=True
)

为什么之前的方法行不通?

  • Pillow的show()方法底层设计依赖X Window环境,就算你指定了command='fbi',它还是会传递一些X相关的参数,或者没有正确设置终端环境变量,导致fbi找不到输出终端,触发unable to open X server错误。
  • 直接用subprocess.call()调用fbi会阻塞脚本,因为fbi默认会等待用户输入;而用Popen配合stdin=DEVNULL可以让fbi在后台独立运行,不影响Python脚本的后续流程。

内容的提问来源于stack exchange,提问作者aquagremlin

火山引擎 最新活动