Python и D-Bus: Как настроить основной цикл? - PullRequest
11 голосов
/ 08 ноября 2010

У меня проблема с python и dbus. Я проверил документы и спецификации разработчика, но я не понимаю, как настроить основной цикл. Я хочу слушать уведомления о событиях. См

http://dbus.freedesktop.org/doc/dbus-python/doc/

и

http://www.galago -project.org / функции / уведомление / 0,9 / index.html

Мой пример сценария:

import dbus
from dbus.mainloop.glib import DBusGMainLoop

class MessageListener:

    def __init__(self):

        DBusGMainLoop(set_as_default=True)

        self.bus = dbus.SessionBus()
        self.proxy = self.bus.get_object('org.freedesktop.Notifications',
            '/org/freedesktop/Notifications')

        self.proxy.connect_to_signal('NotificationClosed',
            self.handle_notification)

    def handle_notification(self, *args, **kwargs):
        print args, kwargs


if __name__ == '__main__':
    MessageListener()

DBusGMainLoop не имеет других методов, таких как run (). Если я использую цикл из gobject и меняю исходный код:

import gobject
loop = gobject.MainLoop()
dbus.set_default_main_loop(loop)
...
loop.run()

Я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  File "dbus_example.py", line 40, in <module>
    MessageListener()
  File "dbus_example.py", line 9, in __init__
    dbus.set_default_main_loop(loop)
TypeError: A dbus.mainloop.NativeMainLoop instance is required

Есть идеи, что с этим делать? Заранее спасибо. Финес

Ответы [ 2 ]

7 голосов
/ 09 ноября 2010

Поставьте import gobject в верхней части вашего кода и после создания экземпляра своего объекта выполните gobject.MainLoop().run(). Я думаю, что MainLoop должен быть создан после создания DBusGMainLoop.

0 голосов
/ 26 августа 2018

У меня была такая же проблема.После того, как мой код заработал, я наткнулся на этот вопрос.

Ответ Дэна частично верен.Сначала вы импортируете объект gobject, но вы также можете создать экземпляр вашего MainLoop перед созданием DBusGMainLoop.Вы должны запустить после создания DBusGMainLoop.

...