使用时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有关主循环内容的一些信息。