我正在尝试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-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()
Run Code Online (Sandbox Code Playgroud)
从您的代码中修改了示例,其中包含如何dbus-python使用以下行设置mainloop :
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
Run Code Online (Sandbox Code Playgroud)
在示例的最后一部分初始化服务后启动mainloop:
if __name__ == "__main__":
a = Example()
loop = gobject.MainLoop()
loop.run()
Run Code Online (Sandbox Code Playgroud)
上面的完整示例可以通过调用来调用dbus-send:
dbus-send --session --print-reply --type=method_call --dest=com.example.HelloWorld /com/example/HelloWorld com.example.HelloWorld.SayHello.SayHello
Run Code Online (Sandbox Code Playgroud)
请注意,通过指定--session而不是从您的问题修改此行--system,并且指定要调用的方法的方法是将方法名称附加到接口的末尾,因此我们在SayHello那里有双部分.如果不是这样,您可以SayHello在服务中导出方法时从界面中删除添加的内容,如下所示:
# only 'IFACE' is used here
@dbus.service.method(dbus_interface=IFACE,
in_signature="", out_signature="")
Run Code Online (Sandbox Code Playgroud)
然后可以像这样调用服务:
dbus-send --session --print-reply --type=method_call --dest=com.example.HelloWorld /com/example/HelloWorld com.example.HelloWorld.SayHello
Run Code Online (Sandbox Code Playgroud)
另请参阅例如如何在DBus中使用现有服务?有关最小服务和客户端代码的更多示例,以及Mainloops的角色,DBus服务中的事件循环有关mainloop内容的一些信息.
| 归档时间: |
|
| 查看次数: |
2934 次 |
| 最近记录: |