使用Python注册"Hello World"DBus服务,对象和方法

sas*_*alm 4 python dbus

我正在尝试com.example.HelloWorld使用对象导出名为的DBus服务,如果使用对象调用/com/example/HelloWorld方法com.example.HelloWorld.SayHello ,则打印"hello,world"的方法

dbus-send --system --type=method_call --dest=com.example.HelloWorld /com/example/HelloWorld com.example.HelloWorld.SayHello

所以我的问题是如何用一个打印"hello,world"的方法(在它自己的标准输出上)创建一个简单的DBus服务.

JoG*_*oGr 6

使用dbus-python以下设置导出D-Bus服务时:

import gobject
import dbus
import dbus.service

from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)


OPATH = "/com/example/HelloWorld"
IFACE = "com.example.HelloWorld"
BUS_NAME = "com.example.HelloWorld"


class Example(dbus.service.Object):
    def __init__(self):
        bus = dbus.SessionBus()
        bus.request_name(BUS_NAME)
        bus_name = dbus.service.BusName(BUS_NAME, bus=bus)
        dbus.service.Object.__init__(self, bus_name, OPATH)

    @dbus.service.method(dbus_interface=IFACE + ".SayHello",
                         in_signature="", out_signature="")
    def SayHello(self):
        print "hello, world"


if __name__ == "__main__":
    a = Example()
    loop = gobject.MainLoop()
    loop.run()
Run Code Online (Sandbox Code Playgroud)

从您的代码中修改了示例,其中包含如何dbus-python使用以下行设置mainloop :

from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
Run Code Online (Sandbox Code Playgroud)

在示例的最后一部分初始化服务后启动mainloop:

if __name__ == "__main__":
    a = Example()
    loop = gobject.MainLoop()
    loop.run()
Run Code Online (Sandbox Code Playgroud)

上面的完整示例可以通过调用来调用dbus-send:

dbus-send --session --print-reply --type=method_call --dest=com.example.HelloWorld /com/example/HelloWorld com.example.HelloWorld.SayHello.SayHello
Run Code Online (Sandbox Code Playgroud)

请注意,通过指定--session而不是从您的问题修改此行--system,并且指定要调用的方法的方法是将方法名称附加到接口的末尾,因此我们在SayHello那里有双部分.如果不是这样,您可以SayHello在服务中导出方法时从界面中删除添加的内容,如下所示:

# only 'IFACE' is used here
@dbus.service.method(dbus_interface=IFACE,
                     in_signature="", out_signature="")
Run Code Online (Sandbox Code Playgroud)

然后可以像这样调用服务:

dbus-send --session --print-reply --type=method_call --dest=com.example.HelloWorld /com/example/HelloWorld com.example.HelloWorld.SayHello
Run Code Online (Sandbox Code Playgroud)

另请参阅例如如何在DBus中使用现有服务?有关最小服务和客户端代码的更多示例,以及Mainloops的角色,DBus服务中的事件循环有关mainloop内容的一些信息.