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

2024-04-24

我正在尝试导出名为的 DBus 服务com.example.HelloWorld,有一个物体/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-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)

在示例的最后一部分中初始化服务后启动主循环:

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,指定调用哪个方法的方法是将方法名称附加到接口的末尾,因此我们有 doubleSayHello部分在那里。如果这不是有意的,您可以删除添加的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

另请参阅例如如何使用DBus现有的服务? https://stackoverflow.com/questions/34148109/how-to-use-the-existing-services-in-dbus/34197133#34197133有关最小服务和客户端代码的更多示例,以及DBus 服务中 Mainloops、Event Loops 的作用 https://stackoverflow.com/questions/33428804/role-of-mainloops-event-loops-in-dbus-service/33432541#33432541有关主循环内容的一些信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 注册“Hello World”DBus 服务、对象和方法 的相关文章

随机推荐