有没有一种方法可以在Python中直接访问硬件?

11

我想自学图形库并尝试用它们制作一些程序。我已经创建了一个小程序,将线条和形状定义为像素列表,但我找不到一种可以直接访问屏幕的方法,以便无需任何中间步骤就可以显示点。

我的意思是我不想使用任何预先构建的图形库,如gnome、cocoa等等。我通常使用Python编码,并且我的程序也使用Python,但我也可以编写和集成C模块。

我知道直接访问屏幕硬件会抛弃Python的多平台特性,但出于学习的目的,我忽略了这一点。那么:有没有办法在Python中直接访问硬件,如果有,是什么?


7
甚至高端游戏(大多数情况下)都不会那么底层的操作。那是驱动程序工作。对于几乎所有应用程序而言,这是完全不切实际的:非常复杂,难以在足够不同的硬件之间移植,并且容易在硬件供应商改进某些东西时出现问题(例如扩展管线),这只是我脑海中的一些想法。除非你想编写驱动程序,否则没有什么可以从中学到。我们有DirectX、OpenGL等等,这是有原因的。而且你可以从Python很好地访问它们(或至少是OpenGL)。 - user395760
6
@delnan,是的,但如果问题是合法的,那么提问者并不需要解释为什么想学习。如果他想编写驱动程序怎么办?“非常复杂,难以在足够不同的硬件上移植,并且容易在硬件供应商改进某些内容时出现故障。”所有这些与打开和关闭像素有什么关系?这就是问题,其他所有观点都是你的广泛推测意见。学会显示一个像素是一种很棒的学习经验。 - yannis
3
你可能是对的。但我的印象是,OP对于什么构成低级图形编程有错误的印象。 - user395760
2
@delnan 好吧,让他用最艰难的方式学习吧 :) - yannis
切换像素的开关状态基本上是我想要做的事情。我知道在这样低级别的操作对于任何实际使用的东西来说都是不切实际的,但在开始使用更高级别的API之前,我想要了解底层软件的工作原理,或者至少有一个大致的了解。 - Émile Jetzer
3个回答

7
不,Python不是用于此类原始硬件访问视频卡的最佳选择。我建议在DOS中使用C进行编写。实际上,我并不推荐这样做。这是一件可怕的事情。但这是我学习如何直接访问硬件的方式,并且这可能是您在没有任何中间件的情况下访问硬件的最好选择。
我之所以提出DOS而不是Linux或NT,是因为这两个操作系统都不会直接向您提供对视频硬件的访问,除非您编写驱动程序。这意味着必须学习整个驱动程序API,并且需要使用很多“魔法”来调用它们,这些魔法可能不太明显,因为在Windows NT中编写视频驱动程序是相当复杂的。
我之所以提出C而不是Python,是因为它可以为您提供真正的指针,并具有使用它们进行愚蠢操作的能力。在DOS下,您可以使用C写入任意物理内存地址,这似乎是您想要的。即使您只想执行Python擅长的简单操作,尝试在允许您直接访问硬件的操作系统下使Python工作也是一种挫败感。
正如其他人所说,不要期望将此项目中学到的任何东西用于现实世界。它可能是有趣的,但如果您试图以这种方式编写实际应用程序,那么维护您的代码的人会立即将您开除。

2

这是一个有点老的帖子,但我在思考同样的问题时偶然发现了它。

我曾经使用汇编语言编程。在那个年代,屏幕绘图只需要将一个值写入内存位置即可。该值打开或关闭像素并定义其颜色。

顺便说一下,“poke”这个术语来自于BASIC,而不是汇编语言。在汇编语言中,您必须将一个值写入数据寄存器,然后使用另一个命令告诉处理器将数据放在哪里,并指定一个地址寄存器,通常以十六进制形式表示!每种不同的处理器都有自己的汇编语言。但是代码运行速度非常快!

随着硬件的进步,我发现图形硬件编程变得越来越复杂。现在,定义一个像素远不止这些。图形子系统有它自己的处理器 - 或者处理器们 - 您需要学会与之交流。处理器不能仅仅将东西放在内存位置上。(我相信曾经有一段时间世界上最快的超级计算机是由图形芯片驱动的!)“Plonk”顺便说一下,不是BASIC命令。

抱歉,我偏离了话题。针对原帖的问题,我认为最好通过使用树莓派来理解图形绘制过程。它与Python兼容,非常适合该工作。其硬件有很好的文档记录,而且价格便宜、易于使用。

希望这能帮助到某些人,祝好运,M


2
这似乎是一条很好的自学之路,我想要补充并建议您考虑在某个时候查看GObjectCairoPygame模块。
Python的GObject模块可能比您当前感兴趣的领域高级,但它使得使用Cairo(请参阅主页)进行像素级别的绘制成为可能,并且为使用Python创建可移植GUI应用程序提供了通用基础。 Pygame也具有像素级别的方法以及对图形驱动程序的访问方法(在更高的级别上)- 这里是一个快速的代码示例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接