Python 如何创建动态创建多个对象的D-Bus服务?
我是D-Bus的新手(对Python来说,这是双重打击!),我正试图找出完成教程中讨论的事情的最佳方法 但是,文本编辑器应用程序 可以轻松拥有多个总线名称 (例如,org.kde.KWrite in 添加到通用文本编辑器),并 多个对象(可能是 /org/kde/documents/4352,其中 数字会随着时间的变化而变化 文档),每个对象都可以 实现多个接口,例如 org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument 例如,假设我想在Python 如何创建动态创建多个对象的D-Bus服务?,python,dbus,Python,Dbus,我是D-Bus的新手(对Python来说,这是双重打击!),我正试图找出完成教程中讨论的事情的最佳方法 但是,文本编辑器应用程序 可以轻松拥有多个总线名称 (例如,org.kde.KWrite in 添加到通用文本编辑器),并 多个对象(可能是 /org/kde/documents/4352,其中 数字会随着时间的变化而变化 文档),每个对象都可以 实现多个接口,例如 org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextFi
flickrapi
周围创建一个包装器,这样服务就可以公开一些flickrapi方法(比如,url\u lookupGroup()
)。如果我想假设服务将始终指定相同的API密钥,并且使用该服务的每个人的身份验证信息都是相同的,那么这是相对简单的
特别是在后一种情况下,我不能真的假设这是真的
根据上面引用的文件,我假设应该有如下内容:
# Get the connection proxy object.
flickrConnectionService = bus.get_object("com.example.FlickrService",
"/Connection")
# Ask the connection object to connect, the return value would be
# maybe something like "/connection/5512" ...
flickrObjectPath = flickrConnectionService.connect("MY_APP_API_KEY",
"MY_APP_API_SECRET",
flickrUsername)
# Get the service proxy object.
flickrService = bus.get_object("com.example.FlickrService",
flickrObjectPath);
# As the flickr service object to get group information.
groupInfo = flickrService.getFlickrGroupInfo('s3a-belltown')
所以,我的问题是:
1) 这是应该如何处理的吗
2) 如果是这样,服务如何知道客户端何时完成?有没有办法检测当前客户端是否断开了连接,以便服务可以清理其动态创建的对象?另外,我首先应该如何创建单个对象
3) 如果这不是应该如何处理的,那么还有什么其他类似的建议
我已经阅读了大量的D-Bus教程和各种文档,最接近我看到的是我上面引用的内容。但是,没有一个示例看起来实际执行了类似的操作,因此我不确定如何继续。1)大多数情况下是的,我只会更改connect方法中的一件事,如我在2)中所述
2) D-Bus连接不是持久的,所有操作都是通过请求/响应消息完成的,除非您在第三个对象中实现此功能,否则不会存储任何连接状态,就像您在闪烁对象中所做的那样。python绑定中的d-bus对象大多是抽象远程对象的代理,就像您“连接”到它们一样,但它真正做的是根据您提供给d-bus对象实例化的信息(对象路径、接口等)构建消息。因此,如果客户机没有通过其他显式调用来宣布,则服务无法知道客户机何时完成
要处理意外的客户端终结,您可以在客户端中创建一个D-Bus对象,并在连接时将对象路径发送到服务,请将connect
方法更改为同时接受ObjectPath
参数。该服务可以监听NameOwnerChanged
信号,以了解客户端是否已死亡
要创建单个对象,您只需在使用“/Connection”的相同服务中实例化一个对象,但必须确保使用的是不存在的名称。您可以有一个“/Connection/Manager”和各种“/Connection/1”和“/Connection/2”
3) 如果需要存储连接状态,则必须执行类似操作