Python 如何创建动态创建多个对象的D-Bus服务?

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

我是D-Bus的新手(对Python来说,这是双重打击!),我正试图找出完成教程中讨论的事情的最佳方法

但是,文本编辑器应用程序 可以轻松拥有多个总线名称 (例如,org.kde.KWrite in 添加到通用文本编辑器),并 多个对象(可能是 /org/kde/documents/4352,其中 数字会随着时间的变化而变化 文档),每个对象都可以 实现多个接口,例如 org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument

例如,假设我想在
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) 如果需要存储连接状态,则必须执行类似操作