【发布时间】:2022-06-10 20:29:01
【问题描述】:
Tl;博士
我需要使用pygame,但由于帧缓冲驱动程序的权限,它无法以普通用户身份初始化屏幕。 root 可以做pygame.display.init() 但不是用户。用户在“视频”组中,可以在/dev/fb0 上写字。用户缺少什么权限,所以 pygame.display.init() 可以工作。
遇到错误:pygame.error: Unable to open a console terminal
说明
所以,我正在尝试使用 pygame 来在帧缓冲区 /dev/fb0 上显示内容。
要使用我需要的某些功能(例如pygame.Surface.convert),必须初始化显示。但是,当调用pygame.display.init() 时出现错误,但仅限于不以 root 身份调用时。
根据@Nodraak (ref),这与framebuffer driver的权限有关。
迟到的答案,但我希望我早点尝试过:
您可能需要 root 才能使用帧缓冲区驱动程序。
(在我的情况下它有所帮助:RaspberryPi 2 没有运行 X,但有一个 屏幕连接。我现在可以通过 SSH 或直接在 RPi)
tree -fupg / | grep fb | grep rwx 似乎没有显示任何可由 root 执行但不能由其他人执行的二进制文件。我很确定将我的用户添加到组中,或在某处调整文件权限就足以解决问题。
注意:出于安全原因,不能以 root 身份运行该软件。
上下文
- 系统:树莓派
- X 服务器:无
- 屏幕:1 (HDMI)
- 连接:远程 (SSH)
错误来源
我正在尝试使用pygame.Surface.convert(...) 函数转换表面。但收到以下错误:
pygame.error: cannot convert without pygame.display initialized
尽管如此,使用 pygame.display.init() 初始化 pygame.display 会出现以下错误:
pygame.error: Unable to open a console terminal
由于我是video 组的一员,我有权在屏幕上写字,cat /dev/urandom > /dev/fb0 正在有效地在屏幕上显示雪。
我还尝试将 SDL_... 环境变量设置为 fbcon 或 dummy,但它没有帮助。我还尝试将 root 环境与用户 su -m user 保持一致,结果相同。
重现错误
在没有 XServer 的 raspberrypi 上,连接 HDMI 屏幕,安装 pygame。
import pygame
pygame.display.init()
错误信息:pygame.error: Unable to open a console terminal
软件版本
python 3.7.3
pygame 1.9.4.post1
OS Raspbian Buster
libsdl 2
相关
【问题讨论】:
-
你试过更新pygame吗?您可以从 Piwheels 项目下载轮子:piwheels.org/project/pygame,或从源代码构建。 (或者从 pip 下载一个轮子,但我不确定 Rpi 与其他 Linux 有何不同)。
-
尝试将 SDL_VIDEODRIVER 变量设置为
directfb。如果它不起作用,请尝试rpi和kmsdrm -
好的,我会试试这个。但问题是它以 root 身份工作,所以我认为这不应该是库的问题????
-
关于 SDL_VIDEODRIVER 这并没有解决问题。将 pygame 更新到 2.1.2 版也没有帮助。还有其他想法吗?
-
@vinalti:如果您描述用例可能会有所帮助。我遇到了与您相同的问题,并认为不值得尝试这种方式。我最终设置了自动启动,以便 pi 用户直接启动到 pygame(因为这是我的目标,我想将 pi 用作永久显示) - 这适用于安装在 pi 上的 pygame,带有“apt获取...”命令(安装 1.9.4.post1),但(对我而言)没有安装 pygame 的“pip”。
标签: python pygame raspberry-pi sdl-2 framebuffer