我正在尝试导出一个名为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服务(在它自己的stdout上)。
答案 0 :(得分: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()
示例是根据您的代码修改的,其中包含如何为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有关mainloop内容的一些信息。