Python - 在Linux上通过cron作业发送KDE knotify消息?

2 投票
1 回答
1570 浏览
提问于 2025-04-17 17:41

我想从一个定时任务(cron job)发送通知到KDE的knotify。下面的代码运行得很好,但当我把它作为定时任务运行时,通知却没有出现。

#!/usr/bin/python2
import dbus
import gobject

album = "album"
artist = "artist"
title = "title"
knotify = dbus.SessionBus().get_object("org.kde.knotify", "/Notify")
knotify.event("warning", "kde", [], title, u"by %s from %s" % (artist, album), [], [], 0, 0, dbus_interface="org.kde.KNotify")

有没有人知道我该如何把这个作为定时任务运行呢?

1 个回答

2

你需要提供一个叫做 DBUS_SESSION_BUS_ADDRESS 的环境变量。

你可以从正在运行的KDE会话中获取这个值。

$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-iHb7INjMEc,guid=d46013545434477a1b7a6b27512d573c

在你的KDE启动设置中(配置里的自动启动模块),创建一个脚本,让它在环境启动后运行。把这个环境变量的值输出到你家目录下的一个临时文件中,然后你就可以在你的定时任务或Python脚本中从这个临时文件中设置这个环境变量。

#!/bin/bash
echo $DBUS_SESSION_BUS_ADDRESS > $HOME/tmp/kde_dbus.session

到2019年的KDE5版本,这个方法依然有效,但结果会稍有不同:

$ echo $DBUS_SESSION_BUS_ADDRESS 
unix:path=/run/user/1863/bus

要测试这个,你可以这样做:

$ qdbus org.freedesktop.ScreenSaver /ScreenSaver SimulateUserActivity

如果你还安装了旧版的KDE4二进制文件,可能需要使用 qdbus-qt5。你可以通过以下方式确定该用哪个:

export QDBUS_CMD=$(which qdbus-qt5 2> /dev/null || which qdbus || exit 1)

当我想防止屏幕保护程序启动时,我会加一个睡眠命令来运行这个,它是有效的。我是从另一台电脑远程运行这个命令的。

对于那些想知道我如何锁定和解锁远程屏幕保护程序的人,这个命令是不同的……

loginctl lock-session 1

或者

loginctl unlock-session 1

这假设你的会话是第一个。你可以为屏幕保护程序的启动和停止添加脚本到KDE的通知事件中。希望这些信息能帮助到想要在多台电脑上同步屏幕保护程序的人。

我知道这个回答有点长,但我想给你提供一个可以测试的例子,以及我今天使用它的一个实际案例。

撰写回答