【问题标题】:read raw input from keyboard in python从python中的键盘读取原始输入
【发布时间】:2013-05-14 15:43:38
【问题描述】:

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

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

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

【问题讨论】:

  • 到底是什么问题?您的代码是否有效,如果无效,您遇到了什么问题?
  • 甚至没有文件 /dev/keyboard 所以我的代码不能工作。
  • 当前在 Linux 终端窗口中按下 Logitech 键盘上的按钮是否可以执行任何操作?
  • @IchUndNichtDu 在那里,我已经列出了您可以在不使用 C 代码的情况下执行的所有选项,这本身会更整洁,但是是的,您的问题是 Python,所以我列出了他们都..

标签: python linux python-3.x keyboard


【解决方案1】:


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

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

考虑到它读取 sys.stdin,这是解决您问题的一个“简单”解决方案,您可能需要一个驱动程序,并且如果操作系统沿途剥离东西,它可能无论如何都会中断。

这是另一种解决方案(仅限linux 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:

【讨论】:

  • 如果我按下这些键(称为 G 键),它们不会出现在 sys.stdin 中。
  • 如果我的解决方案都不起作用,您将无法通过执行 Python 程序获得输入,因为它严重依赖操作系统向您提供您正在寻找的数据。您需要实现一个可以正确处理从键盘发送到操作系统的 USB 事件的驱动程序。这不是 Python 可以做的。
  • 如果硬件受支持但按键不起作用,请尝试摆弄xorg.conf 或您正在使用的任何硬件分析器。
  • 我试过你的第一个和第三个答案。都没有奏效。第一个表明 G 键仍然没有发送任何东西。还是谢谢。
  • 第三个选项pyusb?没有?如果不尝试最后一个选项。无论是那样还是那样,你都不好意思说:)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 2015-01-28
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多