使用 Python 注册“Hello World”DBus 服务、对象和方法

Posted

技术标签:

【中文标题】使用 Python 注册“Hello World”DBus 服务、对象和方法【英文标题】:Register a "Hello World" DBus service, object and method using Python 【发布时间】:2016-04-01 15:55:32 【问题描述】:

我正在尝试导出一个名为 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 服务。

【问题讨论】:

当我将 DBus 支持添加到我最喜欢的终端仿真器时,这是我的第一次尝试:bazaar.launchpad.net/~cmsj/terminator/dbus/revision/1079/… -- 抱歉,几年过去了,我对 DBus 记不太清了 忘记了重要的链接:bazaar.launchpad.net/~cmsj/terminator/dbus/revision/1079/… 【参考方案1】:

使用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()

这个例子是根据你的代码修改的,主循环是如何为dbus-python 设置的,如下:

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

mainloop 是在示例的最后一节中初始化服务后启动的:

if __name__ == "__main__":
    a = Example()
    loop = gobject.MainLoop()
    loop.run()

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

dbus-send --session --print-reply --type=method_call --dest=com.example.HelloWorld /com/example/HelloWorld com.example.HelloWorld.SayHello.SayHello

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

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

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

dbus-send --session --print-reply --type=method_call --dest=com.example.HelloWorld /com/example/HelloWorld com.example.HelloWorld.SayHello

另见例如How to use the existing services in DBus? 获取更多最小服务和客户端代码示例,Role of Mainloops, Event Loops in DBus service 获取有关主循环内容的一些信息。

【讨论】:

On call com.example.HelloWorld.SayHello.SayHello 看起来很有趣,因为 Say Hello 出现了两次。如果您的服务只有一个接口,将装饰器简化为 @dbus.service.method(dbus_interface=IFACE, in_signature=None, out_signature=None) 允许使用单个 Say Hello。

以上是关于使用 Python 注册“Hello World”DBus 服务、对象和方法的主要内容,如果未能解决你的问题,请参考以下文章

Python程序--hello world

微信小程序开发系列之Hello World

python执行”Hello World“程序-003

python 使用Bottle with Rocket的hello world示例。

01 Hello World!

002-python基础-hello-world