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给出的回答是正确的,但是我已经更新了代码以使其更清晰。