我想在Linux中为Amarok编写一个Python脚本,以自动将我的播放器复制到计算器。当我插入播放器时,它会挂载该驱动器,复制任何未完成的播客,并弹出播放器。我怎样才能听到“插入”事件?我已经看穿了,但找不到一个好例子。如何在Python中使用Python侦听'usb device inserted'事件?
34
A
回答
50
更新:正如评论所说,哈尔是不是在新的发行支持,现在的标准是udev的,这里是一个小例子,使得使用圆滑循环,并的udev的,我把哈尔的版本历史原因。
这基本上是example in the pyudev documentation,适合与旧版本的工作,并与油嘴循环,注意过滤器应为您定制的特定需要:
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()
旧版本哈尔和d -bus:
可以使用d-Bus的绑定,并听取DeviceAdded
和DeviceRemoved
信号。 您必须检查已添加设备的功能才能选择存储设备。
这是一个小例子,您可以删除评论并尝试。
import dbus
import gobject
class DeviceAddedListener:
def __init__(self):
您需要使用系统总线连接到Hal Manager。
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
。
self.hal_manager.connect_to_signal("DeviceAdded", self._filter)
我正在使用基于功能的过滤器。它将接受任何volume
,并且会打电话给do_something
,如果您可以阅读Hal文档以找到更适合您的需求的查询或有关Hal设备属性的更多信息。
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)
实施例功能,其中显示有关体积的一些信息:
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()
7
我还没有尝试写这样的程序我自己,但是我刚刚看了以下两个链接(感谢谷歌!),我认为这将是帮助:
- dbus-python tutorial(其中谈到有关如何使用Python来访问d-总线)
- HAL 0.5.10 Specification(其中谈到HAL如何发布事件d-总线)
特别是,阅读有关org.freedesktop.Hal.Manager
接口,它DeviceAdded
和DeviceRemoved
事件。 :-)
希望这有助于!
4
2
这里是5行中的溶液。
import pyudev
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
for device in iter(monitor.poll, None):
if device.action == 'add':
print('{} connected'.format(device))
# do something very interesting here.
保存这一个文件说usb_monitor.py
,运行python monitor.py
。插任何USB,它将打印设备的详细信息
→ python usb_monitor.py
Device('/sys/devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0') connected
Device('/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0') connected
测试上的Python 3.5 pyudev==0.21.0
。
相关问题
- 1. 在Python中侦听文件
- 2. 如何触发并侦听python中的事件?
- 3. 收听python huey事件 - 运行侦听器一次?
- 4. 如何在事件侦听器中使用局部变量?
- 5. 听USB键盘与Python
- 6. 服务器上的python脚本中的事件侦听器
- 7. 事件侦听器在evently
- 8. Python-Firebase侦听器实现
- 9. 添加和使用事件侦听
- 10. 事件侦听器如何工作?
- 11. 如何让borderContainer侦听滚动事件?
- 12. 如何“范围”事件侦听器?
- 13. 如何侦听模态关闭事件?
- 14. 如何简化javascript事件侦听器?
- 15. []如何附加事件侦听器?
- 16. 如何识别Python的SocketServer中正在侦听哪个端口?
- 17. 如何在python中编写侦听'ACK'的端口扫描器?
- 18. Python:收听Pusher API事件
- 19. 事件侦听器5
- 20. reactjs事件侦听器window.resize
- 21. ZF3 onRoute事件侦听器
- 22. 蜡染事件侦听器
- 23. 为什么在函数调用中使用事件侦听器?
- 24. 如何在Python中获取流程实例(使用pid或侦听端口)?
- 25. 事件侦听通知其他事件
- 26. 如何使用自定义事件侦听器与PostSharp方面
- 27. 如何使用串行事件侦听器接收JSON对象?
- 28. 如何使用全局事件侦听器?
- 29. 如何使用事件侦听器复制DOM节点?
- 30. setTimeOut如何与resize事件侦听器一起使用?
我得到一个错误与此代码: dbus.exception.DBusException:org.freedesktop.DBus.Error.ServiceUnknown:名称org.freedesktop.Hal没有被任何文件。服务提供。 你认为你可以帮助我吗? – 2013-10-31 02:09:14