Определение конкретной функции многофункционального устройства ввода с помощью evdev

У меня есть код Python, который взаимодействует с беспроводной цифровой USB-клавиатурой. Я хотел бы иметь возможность обнаруживать устройство по имени, но оно отображается как несколько устройств ввода. В 1_:

# ls -l /dev/input/by-id
total 0
lrwxrwxrwx 1 root root 9 Sep 25 14:30 usb-MOSART_Semi._2.4G_Keyboard_Mouse-event-kbd -> ../event0
lrwxrwxrwx 1 root root 9 Sep 25 14:30 usb-MOSART_Semi._2.4G_Keyboard_Mouse-if01-event-mouse -> ../event1
lrwxrwxrwx 1 root root 9 Sep 25 14:30 usb-MOSART_Semi._2.4G_Keyboard_Mouse-if01-mouse -> ../mouse0

И используя модуль evdev:

>>> import evdev
>>> devices = [evdev.InputDevice(dev) for dev in evdev.list_devices()]
>>> for device in devices:
...   print(device.fn, device.name)
...
/dev/input/event1 MOSART Semi. 2.4G Keyboard Mouse
/dev/input/event0 MOSART Semi. 2.4G Keyboard Mouse

Очевидно, ядро ​​может отличить устройство -kbd от устройства -mouse, но как мне сделать это определение в моем коде? Решение, которое я придумал на данный момент, использует тот факт, что устройство «клавиатура» включает в себя KEY_KP... возможности, поэтому я могу сделать это:

def is_keyboard(device):
    return evdev.ecodes.KEY_KP1 in device.capabilities()[evdev.ecodes.EV_KEY]

... но это кажется скорее эвристическим, чем надежным тестом. Есть ли способ с помощью модуля evdev или альтернативы определить, является ли данное устройство ввода клавиатурой или мышью (или их комбинацией, напоминающей комбинацию франкенштейна)?


person larsks    schedule 26.09.2017    source источник


Ответы (1)


Кажется, что невозможно напрямую определить, является ли данное устройство ввода клавиатурой или мышью в evdev. Но вы можете использовать subprocess как альтернативу.

import subprocess

process = subprocess.run("ls -l /dev/input/by-id", shell=True, stdout=subprocess.PIPE)
devices = process.stdout.decode().split("\n")[1:-1]

Тогда вы можете получить список вроде:

[
    "lrwxrwxrwx 1 root root 9 Sep 25 14:30 usb-MOSART_Semi._2.4G_Keyboard_Mouse-event-kbd -> ../event0",
    "lrwxrwxrwx 1 root root 9 Sep 25 14:30 usb-MOSART_Semi._2.4G_Keyboard_Mouse-if01-event-mouse -> ../event1",
    "lrwxrwxrwx 1 root root 9 Sep 25 14:30 usb-MOSART_Semi._2.4G_Keyboard_Mouse-if01-mouse -> ../mouse0"
]
person Sraw    schedule 26.09.2017