有办法在Python中直接访问硬件吗?

11 投票
3 回答
5772 浏览
提问于 2025-04-17 08:56

我想自己学习图形库,并且想玩一玩。我写了一个小程序,用像素列表来定义线条和形状,但我找不到直接访问屏幕的方法,这样我就能在屏幕上显示这些点,而不需要任何中间步骤。

我的意思是,我不想使用像gnome、cocoa这样的现成图形库。我通常用Python来编程,我的程序也是用Python写的,但我也可以编写并整合C语言模块。

我知道直接访问屏幕硬件会失去Python的跨平台特性,但为了学习我不在乎这个。那么:有没有办法在Python中直接访问硬件,如果有的话,是什么呢?

3 个回答

2

这个话题现在已经有点旧了,但我在思考同样的问题时偶然发现了它。

我以前编写汇编语言程序。在我那个时代,想在屏幕上画东西,简单来说,就是把一个值放到内存的某个位置。这个值可以打开或关闭一个像素,并定义它的颜色。

顺便提一下,“poke”这个词是来自Basic语言,而不是汇编语言。在汇编语言中,你需要把一个值写入数据寄存器,然后用另一条命令告诉处理器把数据放到哪里,通常还要指定一个地址寄存器,地址一般是十六进制的!而且每种不同的处理器都有自己的汇编语言。不过,嘿,那时候的代码执行得可快了!

随着硬件的发展,我发现图形硬件编程变得越来越复杂。现在不只是简单地定义一个像素了。图形系统有自己的处理器——或者说多个处理器——你需要学习如何与它们沟通。处理器可不是随便把东西放到内存里的。(我记得曾经世界上最快的超级计算机一段时间是用图形芯片运行的!)顺便说一下,“plonk”并不是Basic的命令。

抱歉,我有点跑题了。针对原帖提问者的问题,我认为理解图形绘制过程的最佳方法是尝试使用树莓派。它兼容Python,非常适合这个工作。它的硬件文档齐全,而且便宜、易于使用。

希望这对某些人有帮助,干杯,M

7

不,Python并不是进行视频卡这种硬件直接访问的最佳选择。我建议你用C语言在DOS环境下编程。其实,我并不推荐这样做,这是一件很糟糕的事情。但这就是我当初学习的方式,而且这是你能找到的最简单直接的方式来访问硬件,而不需要中间的东西。

我提到DOS而不是Linux或NT,是因为后两者都不能直接访问视频硬件,除非你写一个驱动程序。这就意味着你得学习整个驱动程序的接口,而且你需要调用很多“魔法”,这些东西并不明显,因为在Windows NT下写视频驱动程序相当复杂。

我说用C而不是Python,是因为C语言让你可以使用真正的指针,并且可以做一些比较“傻”的事情。在DOS下,你可以用C语言写入任意的物理内存地址,这似乎正是你想要的。如果你想在一个足够糟糕的操作系统下让Python工作,哪怕只是做一些简单的事情,都会让你感到非常沮丧。

而且,正如其他人所说的,不要指望你在这个项目中学到的东西能在现实世界中用得上。虽然这可能很有趣,但如果你试图用这种方式写一个真正的应用程序,维护你代码的人会立刻想要“杀了”你。

2

这条自学的路径看起来很不错,我想补充一点建议,你可以考虑看看GObjectCairoPygame这几个模块。

Python的GObject模块可能比你现在关注的内容要复杂一些,但它可以让你进行像素级的绘图,配合Cairo使用(你可以查看它的主页),同时也为使用Python开发可移植的图形用户界面应用提供了一个基础。

Pygame同样提供了像素级的方法,还能访问更高层次的图形驱动程序——这里有一个快速的代码示例

撰写回答