在Python中读取键盘原始输入

5

我正在尝试在Python中获取我的键盘的原始输入。我有一个带可编程按键的罗技游戏键盘,但是罗技没有为Linux提供驱动程序。所以我想我可以(尝试)编写自己的驱动程序。我认为解决方案可能是这样的:

with open('/dev/keyboard', 'rb') as keyboard:
    while True:
        inp = keyboard.read()
        -do something-

我的母语不是英语。如果您发现错误,请纠正。


1
具体是什么问题?你的代码是否能正常工作,如果不能,你遇到了哪些问题? - Aya
甚至没有/dev/keyboard文件,所以我的代码无法工作。 - Kritzefitz
你目前在Linux终端窗口中按下Logitech键盘上的按钮是否会有任何反应? - Aya
@IchUndNichtDu,我列出了你所有可能在不涉及C代码的情况下可以做的选项,这样会更整洁一些,但是你的问题是关于Python的,所以我把它们都列出来了。 - Torxed
2个回答

3

两种依赖于操作系统处理键盘输入的输入方法

import sys
for line in sys.stdin.readlines():
    print line

这是一个“简单”的解决方案,考虑到它读取了sys.stdin,您可能需要一个驱动程序,如果操作系统在途中剥离了一些内容,那么它很可能会出现问题。

这是另一种解决方案(仅限于Linux):

import sys, select, tty, termios
class NonBlockingConsole(object):
    def __enter__(self):
        self.old_settings = termios.tcgetattr(sys.stdin)
        tty.setcbreak(sys.stdin.fileno())
        return self

    def __exit__(self, type, value, traceback):
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.old_settings)

    def get_data(self):
        try:
            if select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []):
                return sys.stdin.read(1)
        except:
            return '[CTRL-C]'
        return False

data = ''
printed = ''
last = ''
with NonBlockingConsole() as nbc:
    while 1:
        c = nbc.get_data()
        if c:
            if c == '\x1b': # x1b is ESC
                break
            elif c == '\x7f': # backspace
                data = data[:-1]
                printed = data[:-1]
                last = ''
                sys.stdout.write('\b')
            elif c == '[CTRL-C]':
                data = ''
                last = ''
                sys.stdout.write('\n')
            elif c == '\n': # it's RETURN
                sys.stdout.write('\n')
                # parse data here
                data = ''
            else:
                data += (c)
                last = c
                sys.stdout.write(c)

驱动问题?

如果以上方法都不起作用,你将无法在Python中获取按键。
很可能你需要一个真实的驱动程序,它可以解析从键盘发送的数据,这些数据不是USB堆栈上的普通键盘事件,这意味着... 这对Python来说太底层了,你运气不好... 除非你知道如何构建Linux驱动程序。

无论如何,看看:http://ubuntuforums.org/showthread.php?t=1490385

看起来更多人尝试解决这个问题。

尝试使用PyUSB

http://pyusb.sourceforge.net/docs/1.0/tutorial.html

你可以尝试使用PyUSB解决方案并从USB套接字获取原始数据,但是... 如果G键没有注册为“传统”的USB数据,则可能会被丢弃,你将无法收到它。

在Linux上连接输入管道

另一种未经测试的方法,但可能有效//Hackaday: enter image description here


如果我按下这些键(称为G键),它们不会出现在sys.stdin中。 - Kritzefitz
如果我的解决方案都不起作用,那么你将无法通过Python程序获取输入,因为它严重依赖操作系统向你提供所需的数据。 你需要实现一个驱动程序,能够正确处理从键盘发送到操作系统的USB事件..这不是Python可以做到的。 - Torxed
如果硬件受支持但按键无法正常工作,请尝试调整xorg.conf或您正在使用的任何硬件分析器。 - Torxed
我尝试了你的第一个和第三个答案。都没有起作用。第一个显示G键仍然没有发送任何东西。无论如何还是谢谢。 - Kritzefitz
第三个选项 pyusb 呢?没有吗?如果没有,那就试试最后一个选项。要不然,你只能再次失败了,很抱歉要说 :) - Torxed
是的,抱歉我应该试一下。但我现在没有时间。我会稍后测试并告知是否有效。 - Kritzefitz

0
罗技不提供Linux驱动程序。所以我想我可以尝试为此编写自己的驱动程序。
Linux驱动程序是用C语言编写的,它是非常底层的代码,并在内核空间运行。

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