Search code examples
pythondbus

DBus signal receivers are never called


In my code I register to receive signals when USB devices are inserted.

def registerSignals(self):
    for signal, callback, bus, interface in (('InterfacesAdded', self.onUSBInterfaceAdded, 'org.freedesktop.UDisks2', 'org.freedesktop.DBus.ObjectManager'),
                                            ('InterfacesRemoved', self.onUSBInterfaceRemoved, 'org.freedesktop.UDisks2', 'org.freedesktop.DBus.ObjectManager'),
                                            ('PropertiesChanged', self.onUSBMountPropertiesChanged, 'org.freedesktop.UDisks2', 'org.freedesktop.DBus.ObjectManager')):
        print(self.__bus.add_signal_receiver(callback,
                                        bus_name=bus,
                                        signal_name=signal,
                                        dbus_interface=interface))
                                       
def onUSBInterfaceAdded(self, path, interfaces):
    print(path)
    print(interfaces)

def onUSBInterfaceRemoved(self, path, interfaces):
    print(path)
    print(interfaces)

def onUSBMountPropertiesChanged(self, interface, properties, invalidated, path):
    print(path)
    print(interfaces)

Now, when I run this code, I get no signals. The problem is that when I run dbus-monitor --system in the CLI, I do see the messages when I insert a USB device. Any idea how to debug this? Or what I am doing wrong here?


Solution

  • What D-Bus bindings are you using?

    I find the pydbus bindings to be far easier to work with in Python. For example:

    (venv) pi@raspberrypi:~/stack_overflow $ python3
    Python 3.7.3 (default, Dec 20 2019, 18:57:59) 
    [GCC 8.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import pydbus
    >>> udisk2 = pydbus.SystemBus().get('.UDisks2')
    >>> udisk2.on <-tab complete pressed->
    udisk2.onInterfacesAdded    udisk2.onInterfacesRemoved  udisk2.onPropertiesChanged  
    >>> udisk2.onInterfacesAdded = print
    >>>