在终端中工作但不在cronjob中的Python代码
我已经写了一段代码,在执行时会通知我。我想每半小时运行一次代码,因此创建了一个cronjob。但当通过cronjob执行时,代码不起作用 这是我的密码:在终端中工作但不在cronjob中的Python代码,python,cron,pynotify,Python,Cron,Pynotify,我已经写了一段代码,在执行时会通知我。我想每半小时运行一次代码,因此创建了一个cronjob。但当通过cronjob执行时,代码不起作用 这是我的密码: import sys import pynotify if __name__ == "__main__": if not pynotify.init("icon-summary-body"): sys.exit(1) n = pynotify.Notification("Subject","Message","
import sys
import pynotify
if __name__ == "__main__":
if not pynotify.init("icon-summary-body"):
sys.exit(1)
n = pynotify.Notification("Subject","Message","notification-message-im")
n.show() #throws error here
Cronjob:
* * * * * cd /home/username/Documents && /usr/bin/python file.py >> /home/username/Desktop/mylog.log 2>&1
* * * * * DISPLAY=:0.0 python /home/username/Documents/file.py
Cronjob日志:
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
warnings.warn(str(e), _gtk.Warning)
Traceback (most recent call last):
File "file.py", line 8, in <module>
n.show()
gio.Error: Cannot autolaunch D-Bus without X11 $DISPLAY
notify2脚本的Cronjob日志:
Traceback (most recent call last):
File "file.py", line 3, in <module>
notify2.init('app name')
File "/usr/local/lib/python2.7/dist-packages/notify2.py", line 93, in init
bus = dbus.SessionBus(mainloop=mainloop)
File "/usr/lib/python2.7/dist-packages/dbus/_dbus.py", line 211, in __new__
mainloop=mainloop)
File "/usr/lib/python2.7/dist-packages/dbus/_dbus.py", line 100, in __new__
bus = BusConnection.__new__(subclass, bus_type, mainloop=mainloop)
File "/usr/lib/python2.7/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
我现在得到:-
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
warnings.warn(str(e), _gtk.Warning)
Traceback (most recent call last):
File "file.py", line 12, in <module>
n.show() #throws error here
gio.Error: Could not connect: Connection refused
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/_-init__;.py:57:GtkWarning:无法打开显示
警告。警告(str(e),gtk.警告)
回溯(最近一次呼叫最后一次):
文件“File.py”,第12行,在
n、 show()#在此处抛出错误
gio.错误:无法连接:连接被拒绝
您是否尝试调用cronjob中的显示
Cronjob:
* * * * * cd /home/username/Documents && /usr/bin/python file.py >> /home/username/Desktop/mylog.log 2>&1
* * * * * DISPLAY=:0.0 python /home/username/Documents/file.py
在python代码中,您还可以尝试在开始时调用Display:
import os
# environnement vars
os.environ.setdefault('XAUTHORITY', '/home/user/.Xauthority')
os.environ.setdefault('DISPLAY', ':0.0')
另外,pynotify在root中不起作用。因此,您应该编写不带“sudo”的crontab
尝试设置环境变量$DISPLAY
* * * * * env DISPLAY=:0 cd /home/username/Documents && /usr/bin/python file.py >> /home/username/Desktop/mylog.log 2>&1
您也可以尝试在python代码中调用display,我已经编辑了我的答案。您是在root中调用pynotify还是作为普通用户调用pynotify?->如何修改conjob:
contab-e
或sudo crontab-e
?我以普通用户的身份调用它。我使用sudo crontab-e
修改crontab,而不使用sudo
。你能解释一下为什么会这样吗?好的。因此,如果使用sudo修改crontab,脚本将作为root用户执行。pynotify正在根目录中监听。。因此,您应该尝试删除sudo crontab,并在没有sudo的情况下使用contab-e
重新调用脚本
* * * * * env DISPLAY=:0 cd /home/username/Documents && /usr/bin/python file.py >> /home/username/Desktop/mylog.log 2>&1