Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python从键盘读取原始输入_Python_Linux_Python 3.x_Keyboard - Fatal编程技术网

用python从键盘读取原始输入

用python从键盘读取原始输入,python,linux,python-3.x,keyboard,Python,Linux,Python 3.x,Keyboard,我正在尝试用python获取键盘的原始输入。我有一个带有可编程键的Logitech游戏键盘,但Logitech没有为Linux提供驱动程序。所以我想我可以(尝试)为此编写自己的驱动程序。在我看来,解决方案可能是: with open('/dev/keyboard', 'rb') as keyboard: while True: inp = keyboard.read() -do something- 英语不是我的母语。如果发现错误,请更正。 两种依靠操作

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

with open('/dev/keyboard', 'rb') as keyboard:
    while True:
        inp = keyboard.read()
        -do something-
英语不是我的母语。如果发现错误,请更正。


两种依靠操作系统处理键盘的输入法 考虑到sys.stdin的内容,这是解决问题的一个“简单”解决方案。您可能需要一个驱动程序,如果操作系统在运行过程中剥离了一些内容,它可能无论如何都会崩溃

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

司机问题? 如果上述任何一项都不起作用,您将无法在Python中获取密钥。
最有可能的情况是,您需要一个实际的驱动程序来解析从键盘发送的数据,而这些数据不是USB堆栈上的正常键盘事件,这意味着。。对于Python来说,这是一种低级的方法,而您的运气不好。。。除非你知道如何构建linux驱动程序

无论如何,请看一下:

看起来有更多的人试图对此做些什么

尝试PyUSB

您可以尝试PyUSB解决方案并从USB插座获取原始数据,但再次。。如果G-keys没有注册为“传统”USB数据,它可能会被删除,您将无法收到它

在Linux中连接到输入管道 另一种未经测试但可能有效的方法//Hackday:

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


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

到底是什么问题?你的代码能工作吗?如果不能,你遇到了什么问题?甚至没有一个文件/dev/keyboard,所以我的代码也不能工作。在Linux终端窗口中,按下Logitech键盘上的一个按钮可以做些什么吗?@IchUndNichtDu在那里,我列出了你不必进入C代码就可以做的所有选项,这。。如果我按下这些键(称为G键),它们就不会出现在sys.stdin中。如果我的解决方案都不起作用,你就无法从Python程序中获得输入,因为它严重依赖于操作系统向你提供你要找的数据。您需要实现一个能够正确处理从键盘发送到操作系统的USB事件的驱动程序。。这不是Python所能做到的。如果硬件受支持,但密钥不起作用,请尝试摆弄
xorg.conf
或您正在使用的任何硬件探查器。我尝试了您的第一个和第三个答案。两者都不起作用。第一个显示G键仍然没有发送任何东西。谢谢。第三个选项是
pyusb
?没有什么?如果没有,请尝试最后一个选项。不管是那样还是那样,你很抱歉地说:)
import sys
for line in sys.stdin.readlines():
    print line
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)