对于非root用户,pygame.display.init()失败

问题描述

TL;DR

我需要使用pygame,但由于帧缓冲区驱动程序的权限,它无法以普通用户身份初始化屏幕。超级用户可以执行pygame.display.init()操作,但不能执行用户操作。用户在"VIDEO"组中,可以在/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),它与帧缓冲区驱动程序的权限相关。

回答晚了,但我希望我能早点尝试:

您可能需要是root用户才能使用帧缓冲区驱动程序。

(它对我的情况很有帮助:raspbercrypi2没有运行X,但使用了 屏幕已连接。我现在可以通过SSH或直接在 RPI)

Atree -fupg / | grep fb | grep rwx似乎没有显示任何可以由root执行但不能由其他用户执行的二进制文件。我非常确定将我的用户添加到组或调整某个位置的文件权限就足以解决此问题。

注意:出于安全原因,不能以root身份运行软件。

上下文

  • 系统:raspbercrypi
  • 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_.环境变量设置为fbcondummy,但无济于事。我还尝试保留用户su -m user的根环境,结果相同。

重现错误

在没有XServer的raspbercrypi上,连接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.display.init Documentation
  • SO Question: Pygame display init on headless Raspberry(...)

解决方案

我尝试将PYGAME用作永久显示器时遇到了同样的问题。

我决定让pi自动启动,这样可以正常工作,并以root身份启动pyGame代码。

要激活自动启动, 添加行以开始您的代码

/etc/rc.local

位于exit 0行之上。

例如(我的代码在‘/opt/pyGame_type/pg.py’中)

cd /opt/pygame_prototype
/usr/bin/python3 pg.py

然后在引导时,pi不会转到登录,而是启动pyGame程序。

注意:在没有虚拟环境的情况下使用";apt get";安装的pyGame,较新的pip安装版本使我失败。

相关文章