Добавление методов к объекту dbus в python - PullRequest
2 голосов
/ 21 октября 2010

Мне нужно создать в Python объект dbus с именами методов, которые определяются во время выполнения.

Код, который я пробовал, в основном такой:

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

DBusGMainLoop(set_as_default=True)
gobject.threads_init()

class greg(dbus.service.Object):
        def __init__(self):
                dbus.service.Object.__init__(self, bus, "/greg")

        @dbus.service.method(
                dbus_interface="com.blah.blah",
                in_signature="",
                out_signature="")
        def dance(self):
                print "*busts a move*"

def func(self):
    pass
func = dbus.service.method(
        dbus_interface="com.blah.blah",
        in_signature="",
        out_signature="")(func)
setattr(greg, "do_nothing", func)

bus = dbus.SystemBus()
busname = dbus.service.BusName("com.blah.blah", bus)
obj = greg()
loop = gobject.MainLoop()
loop.run()

В этом случаефункция 'dance' доступна на интерфейсе, а функция 'do_nothing' - нет.Я не понимаю почему?Есть ли способ сделать то, что я пытаюсь достичь?

Ответы [ 2 ]

0 голосов
/ 04 октября 2013

У функции func () нет служебного заголовка dbus, поэтому он не распознается. Как вы можете установить "do_nothing" для своей функции, когда объект greg не содержит такого атрибута?

Проверьте, имеет ли объект атрибут, чтобы убедиться, что ваш оператор завершится успешно.

print(hasattr(greg, "do_nothing"))

Также было бы полезно, если бы вы могли уделять больше внимания рекомендациям по стилю кода Python в будущем: http://www.python.org/dev/peps/pep-0008/

0 голосов
/ 17 февраля 2011

Я предполагаю, что do_nothing метод доступен , но не видимый .Вы пытались вызвать его вслепую?

Что является видимым - это то, что возвращается методом Introspect, что, в свою очередь, зависит от атрибута класса _dbus_class_table, который вам необходимдля обновления Introspect возвращает обновленный список методов D-Bus.

...