在终端中工作但不在cronjob中的Python代码

在终端中工作但不在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","

我已经写了一段代码,在执行时会通知我。我想每半小时运行一次代码,因此创建了一个cronjob。但当通过cronjob执行时,代码不起作用

这是我的密码:

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