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

2023-12-25

Tl;dr

我需要使用pygame但由于权限问题,它无法以普通用户身份初始化屏幕帧缓冲驱动程序。根可以做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) https://stackoverflow.com/a/33828394/17965313这与权限有关帧缓冲驱动程序.

迟到的答案,但我希望我早点尝试过:

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

(这对我的情况有帮助:RaspberryPi 2 没有 X 运行,但有 屏幕已连接。我现在可以通过 SSH 或直接在 RPi)

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

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

Context

  • 系统:树莓派
  • X 服务器:无
  • 屏幕:1(HDMI)
  • 连接:远程(SSH)

错误的根源

我正在尝试使用以下方法转换表面pygame.Surface.convert(...)功能。但收到以下错误:

pygame.error: cannot convert without pygame.display initialized

尽管如此,初始化 pygame.display 与pygame.display.init()给出以下错误:

pygame.error: Unable to open a console terminal

我有权在屏幕上书写,因为我是video组,以及cat /dev/urandom > /dev/fb0有效地在屏幕上显示雪。

我还尝试将 SDL_... 环境变量设置为fbcon or dummy但这没有帮助。我还尝试将根环境与用户一起保留su -m user和相同的结果。

重现错误

在没有 XServer 的树莓派上,连接 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

Related

  • Pygame.display.init 文档 https://www.pygame.org/docs/ref/display.html#pygame.display.init
  • 所以问题:Pygame 在无头 Raspberry 上显示 init(...) https://stackoverflow.com/q/57418067/17965313

问题的解决方案

OpenVT

因此,满足我列出的所有要求的最佳解决方案似乎是使用openvt.

How ?

该过程包含以下几个要点:

1. 添加用户到tty group

以 root 身份将您的用户添加到名为的组中tty,这将允许我们授予它访问 TTY 的权限。

# As root:
usermod -a -G tty $username

2. 为组中的用户授予 TTY 访问权限tty

现在用户已成为该组的一部分tty我们需要允许它在上面写入,因为 openvt 将使用 tty。默认情况下,模式应设置为620我们需要将其设置为660允许小组在其上书写。

# Edit file: /lib/udev/rules.d/50-udev-default.rules
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0660"
#                                      ensure mode is 0660  ^

3.设置SDL环境变量

在您的软件中,确保设置 SDL 的环境变量。

import os
# ...
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
os.environ["SDL_FBDEV"] = "/dev/fb0"

4. 重新启动树莓派

好吧,你不需要一个片段。是否?好吧,好吧。

# as root / with sudo
reboot

5. 启动软件openvt

openvt(打开虚拟终端)允许我们直接通过屏幕访问运行界面。这必须由最终用户在与软件相同的目录中执行(最好)。

openvt -s -- python3 ./interface.py

这应该有效。
当然,您可以将其集成到 Linux 服务中,以便它在启动时启动。但你可能需要添加After: [email protected] /cdn-cgi/l/email-protection in the [Unit]服务文件的部分。

好吧,我花了很多时间才弄清楚这一点,所以我希望它对其他人也有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pygame.display.init() 对于非 root 用户失败 的相关文章

随机推荐

  • Firebase Crashlytics 不报告崩溃

    I have 成功集成 Firebase进入我的项目 身份验证和存储效果很好 但是在简单集成 Crashlytics 并故意崩溃我的应用程序之后 而不是故意 没有崩溃报告出现在崩溃仪表板中 我确实在 Logcat 中看到 D Firebas
  • Shopify CDN 的资产 URL 是如何生成的?

    假设我上传了一张名为 logo png 的图像到 Shopify 上的商店 在 Liquid 模板中 我可以为其生成一个 URL 如下所示 logo png asset url 这会生成一个 URL 例如 http static shopi
  • 使用 sql 连接查询还是使用 pandas 合并查询,哪一种更高效?

    我想在一个表中使用多个表中的数据pandas dataframe 我有两种从服务器下载数据的想法 一种方法是使用SQL连接和检索数据 一种方法是单独下载数据帧并使用 pandas merge 合并它们 SQL Join 当我想将数据下载到p
  • 脚本运行时执行时间限制

    我的 Google Apps 脚本正在迭代用户的 Google 云端硬盘文件 并将文件复制 有时将其移动到其他文件夹 该脚本总是在几分钟后停止 并且日志中没有错误消息 编者注 时间限制随着时间的推移而变化 并且 消费者 免费 和 工作空间
  • MVC .NET 上的 ajax post 未正确传递数组

    我有一个简单的模式 它使用 select2 从服务器获取产品列表 用户可以选择多个产品 然后点击 确定 来优化搜索 我的以下设置从模式中获取数据 并使用强类型视图模型对控制器操作执行 ajax 调用 该视图模型与 JS 尝试通过 ajax
  • C++反向整数序列实现

    谁知道如何实现C std make index sequence反向版本 要得到 make index sequence reverse
  • 使用嵌套类创建类的 Javascript JSON

    我想在 JavaScript 中创建一个具有嵌套对象的 JSON 对象 以下是课程 public class CellChanged private CellLocation Location null private double Cel
  • 引起原因:org.hibernate.HibernateException:找到对集合的共享引用

    我正在运行这个异常 Caused by org hibernate HibernateException Found shared references to a collection path Object listObjects 这是我
  • 如果两项服务位于同一区域,AWS 是否会产生跨账户数据传输费用?

    我想将数据从一个账户中的 EC2 机器传输到另一个账户中的 S3 存储桶 在这里 两个服务都位于同一区域 由于两者都在不同的帐户上 因此数据传输是否通过互联网进行 是的 如果 ec2 和 s3 位于不同区域 无论同一帐户或不同帐户 数据传输
  • JavaScript 数组克隆

    我有这种方法来制作数组 var playerList exports player function socket name this id socket id this name name this x 20 this y 40 retu
  • 单击时功能区按钮不会触发 onAction 设置的事件

    我设计了一个 Outlook 2010 加载项 在其中尝试触发 或者更确切地说 捕获 单击按钮时触发的事件 如图所示在本文中 http social msdn microsoft com Forums en US vsto thread a
  • 回退到 TURN 的连接的预期百分比是多少?

    假设我搭建了WebRTC视频聊天网站 握手后有些连接 ICE Candidates 会直接p2p 有些会使用STUN服务器 有些会使用 最后手段 TURN服务器来建立连接 与直接连接和 STUN 连接 免费 相比 基于 TURN 服务器的连
  • 使用 NIB 文件会导致性能损失吗?

    我很想知道是否有人有经验比较 iPhone 应用程序与 NIB 中布局的视图与完全以编程方式布局的视图 即实例化 UITextView 将其添加到视图 实例化 UIButton 将其添加到视图 的加载时间性能 如果我想要加载一个简单的应用程
  • numpy 有没有办法测试矩阵是否为酉矩阵

    我想知道 numpy 中是否有任何函数可以确定矩阵是否为酉矩阵 这是我写的函数 但它不起作用 如果你们能发现我的函数中的错误和 或告诉我另一种方法来确定给定矩阵是否是单一的 我将不胜感激 def is unitary matrix np n
  • 如何在 C++17 中读取 UTF-16 文本文件

    我对 C 很陌生 我想在 Visual Studio 2019 中读取 C 17 中的 UTF 16 文本文件 我在互联网上尝试了几种方法 包括StackOverflow 但没有一个起作用 并且其中一些无法编译 我认为它们只支持较旧的编译器
  • 如何在 numpy 或 pytorch 中向量化自定义算法?

    假设我有两个矩阵 A size k x m B size m x n 使用自定义操作 我的输出将是k x n 此自定义操作不是行之间的点积A和列B Suppose该自定义操作定义为 对于第 I 行A和第 J 列B the i j输出的元素是
  • 指令解码器如何区分前缀和主操作码?

    我正在尝试了解 x86 指令编码格式 我读过的所有资料仍然让这个主题令人困惑 我开始有点了解它 但我无法理解的一件事是 CPU 指令解码器如何区分操作码前缀和操作码 我知道指令的整个格式基本上取决于操作码 当然还有操作码中定义的额外位字段
  • 在 Folium HeatMapWithTime 中显示日期、id 列和其他列

    我有一个这样的出租车频率数据集 ID Date Latitude Longitude Sample Mean 01 2019 10 09 40 431753 3 711294 0 1 03 2019 10 21 40 431753 3 71
  • 如何使用 HTML5 预加载页面?

    我记得读过有关使浏览器预加载页面的元标记的文章 又是什么标签 预取包含在W3C 规范名为 资源提示 http www w3 org TR resource hints dfn prefetch 它在 Firefox Chrome IE 11
  • pygame.display.init() 对于非 root 用户失败

    Tl dr 我需要使用pygame但由于权限问题 它无法以普通用户身份初始化屏幕帧缓冲驱动程序 根可以做pygame display init 但不是用户 用户位于 视频 组中 可以在其上书写 dev fb0 用户缺少什么权限pygame