openusb nobackenderror devel available python linux usb

nobackenderror - ¿Cómo puedo escuchar los eventos ''usb device inserted'' en Linux, en Python?



pyusb install (4)

Aquí hay una solución en 5 líneas.

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.

Guarde esto en un archivo, digamos usb_monitor.py , ejecute python monitor.py . Enchufe cualquier usb e imprimirá los detalles del dispositivo

→ 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

Probado en Python 3.5 con pyudev==0.21.0 .

Me gustaría escribir un script de Python para Amarok en Linux para copiar automáticamente el podcast de stackoverflow a mi reproductor. Cuando enchufo el reproductor, montaría la unidad, copiaría cualquier podcast pendiente y expulsaría el reproductor. ¿Cómo puedo escuchar el evento "enchufado"? Miré a través de hald pero no pude encontrar un buen ejemplo.


Creo que D-Bus funcionaría como mencionó Chris, pero si está usando KDE4, puede usar Solid Framework de manera similar al applet KDE4 "New Device Notifier".

La fuente de C ++ para ese applet está here , que muestra cómo usar Solid para detectar nuevos dispositivos. Utilice PyKDE4 para enlaces de Python a estas bibliotecas, como se muestra here .


No he intentado escribir un programa así, sin embargo, acabo de ver los siguientes dos enlaces (¡gracias a Google!), Que creo que serán de ayuda:

En particular, lea sobre la interfaz DeviceAdded y DeviceRemoved eventos DeviceAdded y DeviceRemoved . :-)

¡Espero que esto ayude!


Actualización : Como se dijo en los comentarios, Hal no es compatible en las distribuciones recientes, el estándar ahora es udev, aquí hay un pequeño ejemplo que hace uso de glib loop y udev , guardo la versión Hal por razones históricas.

Este es básicamente el ejemplo en la documentación de Pyudev , adaptado para trabajar con versiones anteriores, y con el ciclo glib, observe que el filtro debe personalizarse para su necesidad específica:

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

Versión antigua con Hal y d-bus:

Puede usar enlaces D-Bus y escuchar señales DeviceAdded y DeviceRemoved . Deberá verificar las capacidades del dispositivo Agregado para seleccionar solo los dispositivos de almacenamiento.

Aquí hay un pequeño ejemplo, puedes eliminar los comentarios y probarlo.

import dbus import gobject class DeviceAddedListener: def __init__(self):

Debe conectarse a Hal Manager utilizando el bus del sistema.

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

Y debe conectar un oyente a las señales que le interesan, en este caso, DeviceAdded .

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

Estoy usando un filtro basado en capacidades. Aceptará cualquier volume y llamará a do_something con if, puede leer la documentación de Hal para encontrar las consultas más adecuadas para sus necesidades o más información sobre las propiedades de los dispositivos de 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)

Función de ejemplo que muestra cierta información sobre el volumen:

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