我正在尝试使用python中的pyudev来监控和过滤usb大容量存储设备。在给定的代码中,如果设备的ID_FS_USAGE属性为None,则设备将被过滤掉:
import gtk
from pyudev import Context,Monitor
from pyudev.glib import GUDevMonitorObserver
dev_label = ["0","0"]
serial_list = []
context = Context()
monitor = Monitor.from_netlink(context)
monitor.filter_by(subsystem='block')
observer = GUDevMonitorObserver(monitor)
print dev_label
def device_connected(observer, device):
flag_device = False
flag_serial = False
print device['DEVNAME']
if device['ID_FS_USAGE'] == None : #HERE IS WHERE THE TROUBLE IS
flag_device = True
for iden in serial_list:
if iden == device.__getitem__('ID_SERIAL_SHORT'):
flag_serial =True
if flag_device == False and flag_serial == False:
print dev_label
serial_list.append(device.__getitem__('ID_SERIAL_SHORT'))
Welcome.device_count+=1
if device.__getitem__('ID_FS_LABEL')is not None:
dev_label[Welcome.device_count-1]=str(device.__getitem__('ID_FS_LABEL'))
label = gtk.Label('Device connected :: {0!r}'.format(dev_label[Welcome.device_count-1]))
else :
dev_label[Welcome.device_count-1]=str(device.__getitem__('ID_FS_UUID'))
label = gtk.Label('Device connected :: {0!r}'.format(dev_label[Welcome.device_count-1]))
Welcome.vbox.pack_start(label)
Welcome.window.show_all()
if Welcome.device_count<2:
label = gtk.Label('Connect the second device')
Welcome.vbox.pack_start(label)
Welcome.window.show_all()
else :
Exchange()
observer.connect("device-added",device_connected)
monitor.start()
class Welcome:
device_count = 0
window = gtk.Window()
vbox= gtk.VBox(False, 5)
def __init__(self):
self.window.set_default_size(300, 300)
self.window.set_title("Welcome")
label = gtk.Label("Connect the desired device")
self.vbox.pack_start(label)
self.window.add(self.vbox)
self.window.connect("destroy", lambda q: gtk.main_quit())
self.window.show_all()
class Exchange:
window1 = gtk.Window()
window1.set_title(dev_label[0])
window2 = gtk.Window()
window2.set_title(dev_label[1])
def __init__(self):
width = gtk.gdk.screen_get_default().get_width()
height = gtk.gdk.screen_get_default().get_height()
self.window1.resize(width/2,height)
self.window2.resize(width/2,height)
self.window2.move(self.window1.get_position()[0]+width/2, self.window1.get_position()[1])
label = gtk.Label("Hello")
self.window1.add(label)
self.window1.connect("destroy" , lambda q : gtk.main_quit())
self.window1.show_all()
label = gtk.Label("World")
self.window2.add(label)
self.window2.connect("destroy",lambda q : gtk.main_quit())
self.window2.show_all()
observer.connect("device-added",device_connected)
monitor.start()
Welcome()
gtk.main()执行上述代码后显示的回溯代码为:
['0', '0']
/dev/sdc
Traceback (most recent call last):
File "project.py", line 27, in device_connected
if device['ID_FS_USAGE'] == None :
File "/usr/lib/python2.7/dist-packages/pyudev/device.py", line 831, in __getitem__
raise KeyError(property)
KeyError: 'ID_FS_USAGE'
/dev/sdc
Traceback (most recent call last):
File "project.py", line 27, in device_connected
if device['ID_FS_USAGE'] == None :
File "/usr/lib/python2.7/dist-packages/pyudev/device.py", line 831, in __getitem__
raise KeyError(property)
KeyError: 'ID_FS_USAGE'
/dev/sdc1
['0', '0']
/dev/sdc1
/dev/sde
Traceback (most recent call last):
File "project.py", line 27, in device_connected
if device['ID_FS_USAGE'] == None :
File "/usr/lib/python2.7/dist-packages/pyudev/device.py", line 831, in __getitem__
raise KeyError(property)
KeyError: 'ID_FS_USAGE'
/dev/sde
Traceback (most recent call last):
File "project.py", line 27, in device_connected
if device['ID_FS_USAGE'] == None :
File "/usr/lib/python2.7/dist-packages/pyudev/device.py", line 831, in __getitem__
raise KeyError(property)
KeyError: 'ID_FS_USAGE'
/dev/sdd
Traceback (most recent call last):
File "project.py", line 27, in device_connected
if device['ID_FS_USAGE'] == None :
File "/usr/lib/python2.7/dist-packages/pyudev/device.py", line 831, in __getitem__
raise KeyError(property)
KeyError: 'ID_FS_USAGE'
/dev/sdd
Traceback (most recent call last):
File "project.py", line 27, in device_connected
if device['ID_FS_USAGE'] == None :
File "/usr/lib/python2.7/dist-packages/pyudev/device.py", line 831, in __getitem__
raise KeyError(property)
KeyError: 'ID_FS_USAGE'我在usb大容量存储模式下连接了两个设备,一个是usb存储驱动器,另一个是智能手机。对应于U盘的/dev条目是/dev/sdc和/dev/sdc1。/dev/sdd和/dev/sde对应于电话。在这里,设备/dev/sdd确实有一个名为ID_FS_USAGE的属性,该属性不是none。但它仍然会引发一个KeyError。令人惊讶的是,/dev/sdc1没有出现这样的错误。哪里出了问题?请帮帮我!
发布于 2014-03-23 14:07:56
只在第一个设备上出现错误的原因可能是python在出现第一个错误时停止。
如果不是使用device['ID_FS_USAGE'],而是在没有属性匹配的情况下失败,则需要使用device.get('ID_FS_USAGE'),它将为缺少的属性返回None。
https://stackoverflow.com/questions/22587633
复制相似问题