我正在尝试在Python中获取我的键盘的原始输入。我有一个带可编程按键的罗技游戏键盘,但是罗技没有为Linux提供驱动程序。所以我想我可以(尝试)编写自己的驱动程序。我认为解决方案可能是这样的:
with open('/dev/keyboard', 'rb') as keyboard:
while True:
inp = keyboard.read()
-do something-
我的母语不是英语。如果您发现错误,请纠正。
我正在尝试在Python中获取我的键盘的原始输入。我有一个带可编程按键的罗技游戏键盘,但是罗技没有为Linux提供驱动程序。所以我想我可以(尝试)编写自己的驱动程序。我认为解决方案可能是这样的:
with open('/dev/keyboard', 'rb') as keyboard:
while True:
inp = keyboard.read()
-do something-
我的母语不是英语。如果您发现错误,请纠正。
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
看起来更多人尝试解决这个问题。
http://pyusb.sourceforge.net/docs/1.0/tutorial.html
你可以尝试使用PyUSB解决方案并从USB套接字获取原始数据,但是... 如果G键没有注册为“传统”的USB数据,则可能会被丢弃,你将无法收到它。
另一种未经测试的方法,但可能有效//Hackaday:
xorg.conf
或您正在使用的任何硬件分析器。 - Torxedpyusb
呢?没有吗?如果没有,那就试试最后一个选项。要不然,你只能再次失败了,很抱歉要说 :) - Torxed