【问题标题】:Inspect a received D-Bus signal on its handler在其处理程序上检查接收到的 D-Bus 信号
【发布时间】:2022-02-03 08:05:30
【问题描述】:

我正在构建一个通用 DBus 代理接收器,用户可以利用它来配置通用信号侦听器并将它们代理到另一个服务。

因此,我需要能够收听所有总线信号:

from dbus import SessionBus

def handler(*args, **kwargs):
  print(args, kwargs)

# ...

bus = SessionBus()
bus.add_signal_receiver(handler, signal_name=None, dbus_interface=None, path=None)

这种方法的问题是我无法从处理程序的argskwargs 告诉哪个接口/信号名称/路径与信号相关联:

args=(dbus.String(':1.22395'), dbus.String(''), dbus.String(':1.22395')) kwargs={}

是否有一种简单的方法来检查 DBus 以获取有关接收信号的更多信息?我想它应该存在(dbus-monitor --monitor 做的事情或多或少与我正在尝试做的事情相同),但我在网上找不到任何参考资料。

【问题讨论】:

    标签: python dbus


    【解决方案1】:

    sender_keyworddestination_keywordadd_signal_receiver()的关键字参数。

    您可能需要考虑使用pydbus, or some other more modern D-Bus binding。 dbus-python 是旧的,不是很 Pythonic。它是not very actively maintained,当然没有积极开发。

    【讨论】:

    • 谢谢! pydbus 似乎也没有得到积极维护(最近一次提交是在 2018 年),但至少它有一个更好的接口,并且它将关于接口、对象和信号的信息传递给处理程序 - 所以SessionBus().subscribe(signal_fired=handler) 足以得到所有信息。现在我只需要将我为dbus 编写的所有代码迁移到pydbus :)
    • 天哪,我没有意识到 pydbus 不再被积极维护。谢谢你让我知道。 python-sdbus 可能是一个更好的选择吗?我从未使用过它,但我知道 sdbus(C 版本)设计得很好。 YMMV。
    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多