python监听usb_如何在Linux和Python中监听“插入USB设备”事件?

I'd like to write a Python script for Amarok in Linux to automatically copy the stackoverflow podcast to my player. When I plug in the player, it would mount the drive, copy any pending podcasts, and eject the player. How can I listen for the "plugged in" event? I have looked through hald but couldn't find a good example.

解决方案

Update: As said in comments, Hal is not supported in recent distributions, the standard now is udev, Here is a small example that makes use of glib loop and udev, I keep the Hal version for historical reasons.

This is basically the example in the pyudev documentation, adapted to work with older versions, and with the glib loop, notice that the filter should be customized for your specific needing:

import glib

from pyudev import Context, Monitor

try:

from pyudev.glib import MonitorObserver

def device_event(observer, device):

print 'event {0} on device {1}'.format(device.action, device)

except:

from pyudev.glib import GUDevMonitorObserver as MonitorObserver

def device_event(observer, action, device):

print 'event {0} on device {1}'.format(action, device)

context = Context()

monitor = Monitor.from_netlink(context)

monitor.filter_by(subsystem='usb')

observer = MonitorObserver(monitor)

observer.connect('device-event', device_event)

monitor.start()

glib.MainLoop().run()

Old version with Hal and d-bus:

You can use D-Bus bindings and listen to DeviceAdded and DeviceRemoved signals.

You will have to check the capabilities of the Added device in order to select the storage devices only.

Here is a small example, you can remove the comments and try it.

import dbus

import gobject

class DeviceAddedListener:

def __init__(self):

You need to connect to Hal Manager using the System Bus.

self.bus = dbus.SystemBus()

self.hal_manager_obj = self.bus.get_object(

"org.freedesktop.Hal",

"/org/freedesktop/Hal/Manager")

self.hal_manager = dbus.Interface(self.hal_manager_obj,

"org.freedesktop.Hal.Manager")

And you need to connect a listener to the signals you are interested on, in this case DeviceAdded.

self.hal_manager.connect_to_signal("DeviceAdded", self._filter)

I'm using a filter based on capabilities. It will accept any volume and will call do_something with if, you can read Hal documentation to find the more suitable queries for your needs, or more information about the properties of the Hal devices.

def _filter(self, udi):

device_obj = self.bus.get_object ("org.freedesktop.Hal", udi)

device = dbus.Interface(device_obj, "org.freedesktop.Hal.Device")

if device.QueryCapability("volume"):

return self.do_something(device)

Example function that shows some information about the volume:

def do_something(self, volume):

device_file = volume.GetProperty("block.device")

label = volume.GetProperty("volume.label")

fstype = volume.GetProperty("volume.fstype")

mounted = volume.GetProperty("volume.is_mounted")

mount_point = volume.GetProperty("volume.mount_point")

try:

size = volume.GetProperty("volume.size")

except:

size = 0

print "New storage device detectec:"

print " device_file: %s" % device_file

print " label: %s" % label

print " fstype: %s" % fstype

if mounted:

print " mount_point: %s" % mount_point

else:

print " not mounted"

print " size: %s (%.2fGB)" % (size, float(size) / 1024**3)

if __name__ == '__main__':

from dbus.mainloop.glib import DBusGMainLoop

DBusGMainLoop(set_as_default=True)

loop = gobject.MainLoop()

DeviceAddedListener()

loop.run()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值