мониторинг сообщений 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