Python 从未调用DBus信号接收器

Python 从未调用DBus信号接收器,python,dbus,Python,Dbus,在我的代码中,我注册以在插入USB设备时接收信号 def registerSignals(self): for signal, callback, bus, interface in (('InterfacesAdded', self.onUSBInterfaceAdded, 'org.freedesktop.UDisks2', 'org.freedesktop.DBus.ObjectManager'),

在我的代码中,我注册以在插入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)

现在,当我运行这个代码时,我没有得到任何信号。问题是,在CLI中运行
dbus monitor--system
时,插入USB设备时确实会看到消息。知道如何调试这个吗?或者我做错了什么?

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

我发现在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
>>> 
(venv)pi@raspberrypi:~/stack\u溢出$python3
Python 3.7.3(默认值,2019年12月20日,18:57:59)
linux上的[GCC 8.3.0]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入pydbus
>>>udisk2=pydbus.SystemBus().get('.UDisks2')
>>>udisk2.on
udisk2.on接口添加udisk2.on接口删除udisk2.on属性更改
>>>udisk2.onInterfacesAdded=打印
>>> 

您很可能忘记设置eventloop(将示例转换为普通函数):

导入dbus
从dbus.mainloop.glib导入DBusGMainLoop
从gi.repository导入GLib
def registerSignals():
对于信号、回调、总线、中的接口(('InterfacesAdded',ONUSInterfaceAdded',org.freedesktop.UDisks2','org.freedesktop.DBus.ObjectManager'),
('InterfacesRemoved',onusInterfaceMoved','org.freedesktop.UDisks2','org.freedesktop.DBus.ObjectManager'),
('PropertiesChanged',onUSBMountPropertiesChanged',org.freedesktop.UDisks2','org.freedesktop.DBus.ObjectManager'):
打印(dbus.SystemBus()。添加信号\u接收器(回调,
总线名称=总线,
信号\名称=信号,
dbus_接口=接口)
添加了def ONUSBInterface(路径、接口):
打印(路径)
打印(接口)
def ONUSBInterface已删除(路径、接口):
打印(路径)
打印(接口)
def onUSBMountPropertiesChanged(接口、属性、无效、路径):
打印(路径)
打印(接口)
DBusGMainLoop(将_设置为_default=True)
总线=dbus.SystemBus()
registerSignals()
GLib.MainLoop().run()