使用 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 callcom.example.HelloWorld.SayHello.SayHello
看起来很有趣,因为 Say Hello 出现了两次。如果您的服务只有一个接口,将装饰器简化为 @dbus.service.method(dbus_interface=IFACE, in_signature=None, out_signature=None)
允许使用单个 Say Hello。以上是关于使用 Python 注册“Hello World”DBus 服务、对象和方法的主要内容,如果未能解决你的问题,请参考以下文章