3

DBusを通過するメッセージを読み取るpythonアプリケーションを作成しようとしています.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'

この場合、フィルター条件に一致するすべてのメッセージを監視できます。私が失敗した場所を理解するのを手伝ってくれる人はいますか? ありがとう

4

1 に答える 1

10

Notifyeavesdrop='true'はシグナルではなくメソッドであるため、意図しないメッセージを受信するには、一致ルールの一部として追加する必要があります。dbus-monitor を実行すると、eavesdropdbus-monitor が設定するルールのキーに気付くでしょう。

これは、バグ 39450が修正されたdbus-1.5.6 以降の動作の変更です。

于 2012-10-17T21:16:21.507 に答える