在python中从键盘读取原始输入

时间:2013-05-14 15:43:39

标签: python linux python-3.x keyboard

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

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

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

2 个答案:

答案 0 :(得分:2)


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

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

对于你的问题,这是一个“简单”的解决方案,考虑到它读取sys.stdin,你可能需要一个驱动程序,如果操作系统除去了它可能会破坏的东西。

这是另一个解决方案(linux only afaik):

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

答案 1 :(得分:0)

  

Logitech不提供Linux驱动程序。所以我想我可以(尝试)为此编写自己的驱动程序。

Linux驱动程序是用C语言编写的;它是非常低级的代码,在内核空间中运行。