运行 pydbus 服务时如何获取发件人(客户端进程)

Posted

技术标签:

【中文标题】运行 pydbus 服务时如何获取发件人(客户端进程)【英文标题】:How to get the Sender(client process), when running a pydbus service 【发布时间】:2020-08-14 21:49:56 【问题描述】:

我正在编写一个pydbus服务,我已经注册了一个接口并提供了一个类似的方法

import pydbus
from pydbus import SessionBus
from gi.repository import GLib

class Server():
    """
    <node>
      <interface name="org.freedesktop.testSrv">
        <method name="test">
          <arg direction="in" type="s" name="testarg"/>
         </method>
      </interface>
    </node>
   """
   def test(testarg):
       # here i want to access the sender id
       print(testarg)


bus = SessionBus()
bus.publish("org.freedesktop.testSrv", Server())
loop = GLib.MainLoop()
loop.run()

当客户端调用此端点的方法时,我想知道来源(发送者),它只是执行函数 test()。

我知道 dbus 在请求中提供了这个,例如。喜欢 :.1.23 但我没有找到使用 python 访问这些信息的解决方案。

【问题讨论】:

【参考方案1】:

您可以在方法签名中包含 MethodCallContext(这是一个命名参数,因此必须是 dbus_context):

  def test(self, testarg, dbus_context):
    print(f'"testarg" received from dbus_context.sender')

我不知道这是否被视为 pydbus 的实现细节或 API 的一部分。

【讨论】:

谢谢,这行得通。你知道这是在哪里记录的吗,因为我无法在文档中找到它。 我认为它没有被记录(因此我的回答中的最后一条评论):我通过阅读源代码发现了类似的情况 在这个 pydbus 示例中:github.com/LEW21/pydbus/blob/master/examples/polkit/service.py。搜索源代码的其余部分显示它没有记录。您可以file a bug 将其记录在案。

以上是关于运行 pydbus 服务时如何获取发件人(客户端进程)的主要内容,如果未能解决你的问题,请参考以下文章

在 PyDbus 模拟中使用私有 DBus 连接

推荐使用 pydbus 或 dbus-python 有啥区别?

发件人停止运行时 Azure 服务总线队列 ScheduledEnqueueTimeUtc 的行为

Pydbus中不同数量的参数

如何获取 Google Talk 聊天客户端的电子邮件(默认 IM)而不是公共 IM

向除发件人以外的所有客户端发送响应