【问题标题】:DBus signal receivers are never calledDBus 信号接收器从不被调用
【发布时间】:2020-09-17 08:31:27
【问题描述】:

在我的代码中,我注册以在插入 USB 设备时接收信号。

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)

现在,当我运行此代码时,我收到 no 信号。问题是当我在 CLI 中运行 dbus-monitor --system 时,我确实在插入 USB 设备时看到了这些消息。知道如何调试吗?还是我在这里做错了什么?

【问题讨论】:

    标签: python dbus


    【解决方案1】:

    您使用的是什么 D-Bus 绑定?

    我发现pydbus 绑定在 Python 中更容易使用。例如:

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

    【讨论】:

      【解决方案2】:

      您很可能忘记设置事件循环(将您的示例转换为普通函数):

      import dbus
      from dbus.mainloop.glib import DBusGMainLoop
      from gi.repository import GLib
      
      
      def registerSignals():
          for signal, callback, bus, interface in (('InterfacesAdded', onUSBInterfaceAdded, 'org.freedesktop.UDisks2', 'org.freedesktop.DBus.ObjectManager'),
                                                   ('InterfacesRemoved', onUSBInterfaceRemoved, 'org.freedesktop.UDisks2', 'org.freedesktop.DBus.ObjectManager'),
                                                   ('PropertiesChanged', onUSBMountPropertiesChanged, 'org.freedesktop.UDisks2', 'org.freedesktop.DBus.ObjectManager')):
              print(dbus.SystemBus().add_signal_receiver(callback,
                                                         bus_name=bus,
                                                         signal_name=signal,
                                                         dbus_interface=interface))
      
      
      def onUSBInterfaceAdded(path, interfaces):
          print(path)
          print(interfaces)
      
      
      def onUSBInterfaceRemoved(path, interfaces):
          print(path)
          print(interfaces)
      
      
      def onUSBMountPropertiesChanged(interface, properties, invalidated, path):
          print(path)
          print(interfaces)
      
      
      DBusGMainLoop(set_as_default=True)
      bus = dbus.SystemBus()
      registerSignals()
      GLib.MainLoop().run()
      

      【讨论】:

        猜你喜欢
        • 2016-09-16
        • 2016-09-08
        • 2021-05-23
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 2020-11-16
        • 2021-09-20
        • 2015-03-16
        相关资源
        最近更新 更多