gpt4 book ai didi

python-3.x - 使用 libnotify 的 Python 3 脚本作为 cron 作业失败

转载 作者:行者123 更新时间:2023-12-05 00:12:43 25 4
gpt4 key购买 nike

我有一个 Python 3 脚本,它从 URL 获取一些 JSON,对其进行处理,并在我获取的数据发生任何重大变化时通知我。我试过使用 notify2PyGObject的 libnotify 绑定(bind) (gi.repository.Notify) 并使用任一方法获得相似的结果。当我从终端运行这个脚本时,它工作正常,但当 cron 尝试运行它时会卡住。

import notify2
from gi.repository import Notify

def notify_pygobject(new_stuff):
Notify.init('My App')
notify_str = '\n'.join(new_stuff)
print(notify_str)
popup = Notify.Notification.new('Hey! Listen!', notify_str,
'dialog-information')
popup.show()

def notify_notify2(new_stuff):
notify2.init('My App')
notify_str = '\n'.join(new_stuff)
print(notify_str)
popup = notify2.Notification('Hey! Listen!', notify_str,
'dialog-information')
popup.show()

现在,如果我创建一个脚本来调用带有字符串列表的 notify_pygobject,cron 会通过邮件假脱机向我抛回此错误:

Traceback (most recent call last):
File "/home/p0lar_bear/Documents/devel/notify-test/test1.py", line 3, in <module>
main()
File "/home/p0lar_bear/Documents/devel/notify-test/test1.py", line 4, in main
testlib.notify(notify_projects)
File "/home/p0lar_bear/Documents/devel/notify-test/testlib.py", line 8, in notify
popup.show()
File "/usr/lib/python3/dist-packages/gi/types.py", line 113, in function
return info.invoke(*args, **kwargs)
gi._glib.GError: Error spawning command line `dbus-launch --autolaunch=776643a88e264621544719c3519b8310 --binary-syntax --close-stderr': Child process exited with code 1

...如果我将其改为调用 notify_notify2():

Traceback (most recent call last):
File "/home/p0lar_bear/Documents/devel/notify-test/test2.py", line 3, in <module>
main()
File "/home/p0lar_bear/Documents/devel/notify-test/test2.py", line 4, in main
testlib.notify(notify_projects)
File "/home/p0lar_bear/Documents/devel/notify-test/testlib.py", line 13, in notify
notify2.init('My App')
File "/usr/lib/python3/dist-packages/notify2.py", line 93, in init
bus = dbus.SessionBus(mainloop=mainloop)
File "/usr/lib/python3/dist-packages/dbus/_dbus.py", line 211, in __new__
mainloop=mainloop)
File "/usr/lib/python3/dist-packages/dbus/_dbus.py", line 100, in __new__
bus = BusConnection.__new__(subclass, bus_type, mainloop=mainloop)
File "/usr/lib/python3/dist-packages/dbus/bus.py", line 122, in __new__
bus = cls._new_for_bus(address_or_type, mainloop=mainloop)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

我做了一些研究,看到了将 PATH= 放入我的 crontab 或导出 $DISPLAY 的建议(我通过调用 在脚本中完成了此操作os.system('export DISPLAY=:0')) 但都没有导致任何改变...

最佳答案

您走在正确的轨道上。这种行为是因为 cron 在多用户 headless 环境中运行(将其视为在没有 GUI 的终端中以 root 身份运行,有点),所以他不知道显示(X Window Server session )和用户目标。如果您的应用程序打开,例如,某些用户桌面的窗口或通知,则会引发此问题。

我想您使用 crontab -e 编辑了您的 cron,条目如下所示:

m h dom mon dow 命令

类似于:

0 5 * * 1/usr/bin/python/home/foo/myscript.py

请注意,我使用 Python 的完整路径,如果这种 PATH 环境变量可能不同的情况会更好。

然后只需更改为:

0 5 * * 1 export DISPLAY=:0 &&/usr/bin/python/home/foo/myscript.py

如果这仍然不起作用,您需要允许您的用户控制 X Windows 服务器:

添加到您的.bash_rc:

xhost +si:localuser:$(whoami)

关于python-3.x - 使用 libnotify 的 Python 3 脚本作为 cron 作业失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17278650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com