Python /dev/input/event的格式*
位于Python /dev/input/event的格式*,python,linux,device,Python,Linux,Device,位于/dev/input/event*中的字符设备的“格式”是什么 换句话说,我如何解码字符流?非常感谢Python示例。数据的形式为输入事件结构;有关C示例,请参见。结构定义位于(例如)。请注意,在读取设备之前,您需要使用一系列的ioctl调用来获取设备上的信息。Linux源文件中描述了该格式。基本上,您可以从文件中读取以下形式的结构: struct input_event { struct timeval time; unsigned short type; unsi
/dev/input/event*
中的字符设备的“格式”是什么
换句话说,我如何解码字符流?非常感谢Python示例。数据的形式为
输入事件
结构;有关C示例,请参见。结构定义位于(例如)。请注意,在读取设备之前,您需要使用一系列的ioctl
调用来获取设备上的信息。Linux源文件中描述了该格式。基本上,您可以从文件中读取以下形式的结构:
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
type
和code
是在linux/input.h
中定义的值。例如
对于鼠标的相对力矩,类型可能是EV\u REL
,对于鼠标的相对力矩,类型可能是EV\u KEY
按键时,code
为按键编码,或REL_X
或ABS_X
为按键编码
鼠标。就在模块的这里。您还需要该模块。该包提供到事件设备接口的绑定。一个简短的用法示例是:
from evdev import InputDevice
from select import select
dev = InputDevice('/dev/input/event1')
while True:
r,w,x = select([dev], [], [])
for event in dev.read():
print(event)
# event at 1337427573.061822, code 01, type 02, val 01
# event at 1337427573.061846, code 00, type 00, val 00
请记住,与目前提到的非常方便的纯Python模块不同,它包含C扩展。构建它们需要安装Python开发和内核头。一个简单的原始读取器可以通过以下方式完成:
#!/usr/bin/python
import struct
import time
import sys
infile_path = "/dev/input/event" + (sys.argv[1] if len(sys.argv) > 1 else "0")
"""
FORMAT represents the format used by linux kernel input event struct
See https://github.com/torvalds/linux/blob/v5.5-rc5/include/uapi/linux/input.h#L28
Stands for: long int, long int, unsigned short, unsigned short, unsigned int
"""
FORMAT = 'llHHI'
EVENT_SIZE = struct.calcsize(FORMAT)
#open file in binary mode
in_file = open(infile_path, "rb")
event = in_file.read(EVENT_SIZE)
while event:
(tv_sec, tv_usec, type, code, value) = struct.unpack(FORMAT, event)
if type != 0 or code != 0 or value != 0:
print("Event type %u, code %u, value %u at %d.%d" % \
(type, code, value, tv_sec, tv_usec))
else:
# Events with code, type and value == 0 are "separator" events
print("===========================================")
event = in_file.read(EVENT_SIZE)
in_file.close()
仅供参考,它对应于python结构的FORMAT='llHHI',这两个模块不能单独使用…它们对pycopia的东西有其他依赖性。不,但我想答案不清楚--因为链接直接指向模块,而不是包本身。@larsks我也只是指出了它,因为它包含了这个界面的一些硬部分,如果你想这样做的话,可能会更容易“滚动你自己的”。你知道格式是什么意思吗?当我将事件转换为十六进制时,它是一个长字符串。是否有必要知道值是哪个字节?格式行上方的注释描述了它的含义。我认为长度取决于系统架构,但在我的Raspberry Pi中,长int是4字节,无符号短int是2字节,无符号int是4字节。这将生成16个字符的十六进制字符串,最后4个字符是值。同样值得注意的是,详细说明了不同的事件类型和值。@etw3 Oliver给出的回答是正确的,但是我已经更新了代码以使其更清晰。