如何通过Python中的QDbus触发KDE Plasma关闭或注销?

0 投票
1 回答
86 浏览
提问于 2025-04-14 15:26

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()

撰写回答