等待dbus会话锁定/解锁消息

2024-09-29 23:29:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python实现一个dbus侦听器,它在会话被锁定时执行一个函数,当会话被解锁时执行另一个函数。基本上,我希望将以下命令转换为Python程序(显然,该命令没有回调):

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

此命令返回以下命令:

^{pr2}$

PythonMWE来了。但是,它没有收到任何消息(尝试用sudo启动它并以用户身份启动):

#!/usr/bin/env python

from datetime import datetime
import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop

def locker_callback(*args):
    print "%s    Lock%s" % (datetime.now().ctime(), args)

DBusGMainLoop(set_as_default=True)                        # integrate into gobject main loop
bus = dbus.SystemBus()                                    # connect to system wide dbus
bus.add_signal_receiver(                                  # define the signal to listen to
    locker_callback,                                      # callback function
    'LockedHint',                                         # signal name
    'org.freedesktop.DBus.Properties.PropertiesChanged',  # interface
    'org.freedesktop.login1'                              # bus name
)

loop = gobject.MainLoop()
loop.run()

仅供参考,我使用XScreenSaver在ubuntu18.04上运行xfce。在


Tags: to函数orgimport命令loopdatetimesignal
1条回答
网友
1楼 · 发布于 2024-09-29 23:29:24

“LockedHint”不是信号,而是属性。信号在接口org.freedesktop.DBus.Properties中为“PropertiesChanged”。通常使用d-feet(一种图形化的d-Bus“调试器”)查找这些代码是最容易的,但我相信API文档也会显示这一点。在

以下是工作属性通知的相同代码:

#!/usr/bin/env python

from datetime import datetime
import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop

def properties_changed_callback(*args):
    print "%s %s" % (datetime.now().ctime(), args)

DBusGMainLoop(set_as_default=True)
dbus.SystemBus().add_signal_receiver(
    properties_changed_callback,
    'PropertiesChanged',
    'org.freedesktop.DBus.Properties',
    'org.freedesktop.login1'
)

gobject.MainLoop().run()

当然,这将为每个属性更改打印一行,而不仅仅是“LockedHint”。另外,请注意,dbus模块现在是遗留的:您可能需要查看pydbus以获取新代码。在

如果您想在用户会话中运行处理程序,并且只对自己的会话被锁定感兴趣,那么您可能不想使用logindapi:看看org.freedesktop.ScreenSaver(在会话总线中)作为替代(它将简单得多,因为名称是众所周知的,并且有一个“ActiveChanged”信号可以使用)。我再次建议使用d-feet来浏览API。在

相关问题 更多 >

    热门问题