наблюдение на dbus съобщения от python

Опитвам се да направя приложение на Python, което чете съобщенията, преминаващи през DBus, нещо, което дава същия изход на bash dbus-monitor. Според това, което получих от моето търсене, кодът трябва да е доста прост и ясен, нещо като:

import dbus, gobject
from dbus.mainloop.glib import DBusGMainLoop

def msg_cb(bus, msg):
    args = msg.get_args_list()
    print "Notification from '%s'" % args[0]
    print "Summary: %s" % args[3]
    print "Body: %s", args[4]

if __name__ == '__main__':
    DBusGMainLoop(set_as_default=True)
    bus = dbus.SessionBus()

    string = "interface='org.freedesktop.Notifications',member='Notify'"
    bus.add_match_string(string)
    bus.add_message_filter(msg_cb)

    mainloop = gobject.MainLoop ()
    mainloop.run ()

Но като го стартирам, получавам само съобщението, върнато от DBus, че приложението е свързано, различно от това, което получавам, ако изпълня командата bash:

dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify'

В този случай мога да гледам всички съобщения, отговарящи на условието на филтъра. Моля, някой да ми помогне да разбера къде се провалям? Благодаря


person r08y    schedule 18.07.2012    source източник
comment
Това може да не отговори на въпроса ви, но инсталирането на qt4-dev-tools и стартирането на qtdbusviewer може да си струва да се провери. Използвам го доста често за отстраняване на грешки в моя dbus код. Мисля, че може да показва dbus съобщения в своя изход, ако го стартирате от командния ред. наздраве   -  person NuclearPeon    schedule 19.07.2013
comment
Изглежда, че синтаксисът се е променил доста само за 2 години. Поне на моя python 2.7.8 вече не получавам никакъв print изход с този синтаксис в стил printf-C, въпреки че начинът за получаване на съобщенията ми се струва правилен.   -  person syntaxerror    schedule 11.10.2014


Отговори (1)


Notify е метод, а не сигнал, така че трябва да добавите eavesdrop='true' като част от правилото за съвпадение, за да получавате съобщения, които не са предназначени за вас. Ако стартирате dbus-monitor, ще забележите ключа eavesdrop в правилата, които dbus-monitor настройва.

Това е промяна в поведението, смятам, че след dbus-1.5.6, където бъг 39450 беше коригирано.

person Martin Vidner    schedule 17.10.2012