如何在Linux和Python中侦听“插入USB设备"事件? [英] How can I listen for 'usb device inserted' events in Linux, in Python?

查看:842
本文介绍了如何在Linux和Python中侦听“插入USB设备"事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在Linux中为Amarok编写Python脚本,以自动将stackoverflow播客复制到我的播放器中.当我插入播放器时,它将安装驱动器,复制所有未决的播客,然后弹出播放器.如何收听插入"事件?我浏览了一下,但找不到一个很好的例子.

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.

推荐答案

更新:如评论中所述,最近的发行版不支持Hal,现在的标准是udev,这是一个小例子利用glib循环和 udev ,出于历史原因,我保留Hal版本.

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.

这基本上是pyudev中的示例文档(适用于较早版本和glib循环),请注意应根据您的特定需求自定义过滤器:

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()

带有Hal和d-bus的旧版本:

Old version with Hal and d-bus:

您可以使用D-Bus绑定并收听DeviceAddedDeviceRemoved信号. 您必须检查添加的设备"的功能才能仅选择存储设备.

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):

您需要使用系统总线连接到Hal Manager.

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")

您需要将一个侦听器连接到您感兴趣的信号,在本例中为DeviceAdded.

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)

我正在使用基于功能的过滤器.它会接受任何volume并会调用do_something,如果您可以阅读Hal文档以找到更适合您需要的查询,或者有关Hal设备属性的更多信息.

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()

这篇关于如何在Linux和Python中侦听“插入USB设备"事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆