如何通过Python中的QDbus触发KDE Plasma关闭或注销?
KDE Plasma会话可以通过在终端窗口中输入以下命令来注销:
qdbus6 org.kde.Shutdown /Shutdown org.kde.Shutdown.logout
或者直接使用:
qdbus6 org.kde.Shutdown /Shutdown logout
当我运行这个命令时,它会立即让我注销。类似的方法也可以用来关机和重启。
我想从一个Python脚本中触发同样的操作。
Qt中的QtDBus模块可以用来在DBus系统上发送消息。这个模块在PySide6中可以使用,我正在尝试从Python发送相同的信号:
from PySide6.QtDBus import QDBusConnection, QDBusMessage
connection = QDBusConnection.sessionBus()
message = QDBusMessage.createTargetedSignal("org.kde.Shutdown", "/Shutdown", "org.kde.Shutdown", "logout")
print(connection.send(message))
如果这个代码作为脚本运行,或者在Python解释器中输入,它会返回True
,但如果用sudo
以root身份运行这个脚本,它会返回False
。这让我觉得org.kde.Shutdown
是通过sessionBus()
连接可用的,也就是说这个连接是指向用户会话总线的。
那么,为什么当我运行这个脚本时,Plasma没有注销呢?
非常感谢任何帮助。
1 个回答
0
你的qdbus命令不是在发送一个信号,而是在发送一个方法调用。这两种消息类型在D-Bus中是不同的(通常用法也正好相反——一个典型的信号是由一个对象和接口发送的,而这个发送者是自己发布的;它并不是指向接收方的任何对象。)你可以查看文档了解更多。
方法调用总是会导致一个回复,所以你应该使用call()
来发送它们,而不是用send()
。