python检测usb插拔_检测热插拔偶数的python脚本

本文介绍了一种使用Python结合evdev和pyudev库来检测USB设备,特别是键盘和鼠标热插拔的方法。在检测过程中,作者遇到了问题:当鼠标拔出时,脚本无法正确处理,因为/dev/input/目录下的mouseX和eventX文件行为异常。为了解决这个问题,作者使用了一种技巧,但仍然会导致脚本在无输入时进入无限循环。提供的代码展示了如何监听USB输入设备的添加和移除事件,并输出相应的键盘和鼠标事件。
摘要由CSDN通过智能技术生成

我尝试使用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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值