我尝试使用python来检测鼠标和键盘事件,并在检测期间容忍热插拔操作。我编写这个脚本来自动检测运行时的键盘和鼠标插件,并输出所有的键盘和鼠标事件。我使用evdev和pyudev包来实现这个功能。我的键盘和鼠标检测主要包括键盘和插件。然而,每当我拔掉鼠标,许多奇怪的事情发生,我的脚本无法正常工作。我有几个困惑。在
(1)每当鼠标插入系统时,/dev/input/文件夹中都会生成两个文件,包括./mouseX和./eventX。我试图通过cat查看这两个源代码的输出,它们确实存在差异,但我不明白为什么linux会有./mouseX,即使./eventX已经存在?在
(2)每当我拔下鼠标时,./mouseX plumble事件首先出现,我在evdev中没有使用这个事件,这导致脚本失败,因为./eventX(我在其中读取脚本中的数据)同时被拔出,但我只能在下一轮中检测到./eventX。我使用了一个技巧(脚本中的变量I)来绕过这个问题,但是即使我可以成功地删除鼠标设备,但是选择。选择()开始无休止的输入阅读,即使我没有在键盘上键入任何东西。在
脚本如下所示(根据previous post的答案修改),感谢您的关注!在#!/usr/bin/env python
import pyudev
from evdev import InputDevice, list_devices, categorize
from select import select
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='input')
monitor.start()
devices = map(InputDevice, list_devices())
dev_paths = []
finalizers = []
for dev in devices:
if "keyboard" in dev.name.lower():
dev_paths.append(dev.fn)
elif "mouse" in dev.name.lower():
dev_paths.append(dev.fn)
devices = map(InputDevice, dev_paths)
devices = {dev.fd : dev for dev in devices}
devices[monitor.fileno()] = monitor
count = 1
while True:
r, w, x = select(devices, [], [])
if monitor.fileno() in r:
r.remove(monitor.fileno())
for udev in iter(functools.partial(monitor.poll, 0), None):
# we're only interested in devices that have a device node
# (e.g. /dev/input/eventX)
if not udev.device_node:
break
# find the device we're interested in and add it to fds
for name in (i['NAME'] for i in udev.ancestors if 'NAME' in i):
# I used a virtual input device for this test - you
# should adapt this to your needs
if 'mouse' in name.lower() and 'event' in udev.device_node:
if udev.action == 'add':
print('Device added: %s' % udev)
dev = InputDevice(udev.device_node)
devices[dev.fd] = dev
break
if udev.action == 'remove':
print('Device removed: %s' % udev)
finalizers.append(udev.device_node)
break
for path in finalizers:
for dev in devices.keys():
if dev != monitor.fileno() and devices[dev].fn == path:
print "delete the device from list"
del devices[dev]
for i in r:
if i in devices.keys() and count != 0:
count = -1
for event in devices[i].read():
count = count + 1
print(categorize(event))