python通知模块&;克朗:吉奥,错误

python通知模块&;克朗:吉奥,错误,python,cron,env,Python,Cron,Env,我正在请求一些帮助来使用显示通知,因为我尝试过的一切都不起作用。当cron启动脚本时,显示未初始化。当我手动启动它时,这就是工作。 我尝试过的代码: #!/usr/bin/env python # coding: utf8 import subprocess import os #os.environ.setdefault("XAUTHORITY", "/home/guillaume" + "/.Xauthority") #os.enviro

我正在请求一些帮助来使用显示通知,因为我尝试过的一切都不起作用。当cron启动脚本时,显示未初始化。当我手动启动它时,这就是工作。 我尝试过的代码:

    #!/usr/bin/env python
    # coding: utf8

    import subprocess
    import os

    #os.environ.setdefault("XAUTHORITY", "/home/guillaume" + "/.Xauthority")

    #os.environ.setdefault('DISPLAY', ':0.0')     # do not work
    #os.environ['DISPLAY'] = ':0.0'               # do not work
    print = os.environ

    cmd2 = 'notify-send test'
    subprocess.call(cmd2, shell=True)

    # more code, which is working (using VLC)
    cmd3 = "cvlc rtp://232.0.2.183:8200 --sout file/mkv:/path/save/file.mkv" # to download TV's flow
    with open("/path/debug_cvlc.log", 'w') as out:
        proc = subprocess.Popen(cmd3, stderr=out, shell=True, preexec_fn=os.setsid)
    pid = proc.pid                  # to get the pid
    with open("/path/pid.log", "w") as f:
       f.write(str(pid))            # to write the pid in a file
    # I'm using the pid to stop the download with another cron's task, and to display another notify message. 
    # Download and stop is working very well, and zenity too. But not notify-send
谢谢

编辑:以下是我为这个cron脚本提供的环境变量: Edit2:我在cron中调用我的脚本,如下所示: 我有两个屏幕,所以我认为DISPLAY:0.0是显示此通知的方式。。 但我没看到

Edit3:我似乎对notify send有问题,因为它使用zenity工作: 我有notify send版本0.7.3,并且我确定notify send正在与终端一起工作

Edit4:下一次尝试python notify。 日志文件显示:(法语)

最后,cron的行是这样的:

20 15 1 7 * export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-M0JCXXbuhC && export DISPLAY=:0.0 && python script.py

然后显示通知。问题已解决!!:)

crontab被视为外部主机——它没有写入显示器的权限

解决方法:允许任何人写入您的显示器。登录时在shell中键入以下内容:

xhost +

你把这个老太婆叫做

45 9 30 6 * DISPLAY=:0.0 python /home/path/script.py > /home/path/debug_cron_on.log 2>&1
这是不正确的,因为您没有导出
DISPLAY
变量,并且后续命令没有运行

试试这个

45 9 30 6 * export DISPLAY=:0.0 && cd /home/path/ && python script.py >> debug_cron.log 2>&1
此外,您还在cron作业中设置
DISPLAY
变量,因此请尝试cron作业是否工作,而不在作业行中导出它

45 9 30 6 * cd /home/path/ && python script.py >> debug_cron.log 2>&1
编辑

调试时,每分钟运行一次cron作业。以下几点对我很有用:

Cron条目

* * * * *  cd /home/user/Desktop/test/send-notify && python script.py
script.py

#!/usr/bin/env python

import subprocess
import os

os.environ.setdefault('DISPLAY', ':0.0')
print os.environ

cmd2 = 'notify-send test'
subprocess.call(cmd2, shell=True)
编辑2

使用
pynotify
,script.py变为

#!/usr/bin/env python

import pynotify
import os

os.environ.setdefault('DISPLAY', ':0.0')

pynotify.init("Basic")
n = pynotify.Notification("Title", "TEST123")
n.show()
并且cron条目变得

* * * * *  cd /home/user/Desktop/test/send-notify && python script.py
编辑3

cron环境中缺少一个环境变量
DBUS\u SESSION\u BUS\u ADDRESS

它可以在和方式中设置

谢谢,因此如果我理解的话,就不需要“os.environ”?在Python中执行
os.environ['DISPLAY']=':0'
,或者在调用中执行:
subprocess.call('DISPLAY=:0'+cmd2,shell=True)
。后者依赖于您运行Bash shell,但这很常见。它不起作用,下面是日志文件的返回:
禁用访问控制,客户端可以从任何主机连接。但是通知不会显示在屏幕上。尝试长格式的
显示
,其中包含主机名/IP地址和
:0
。另请参见与
:0
相同的问题,我有两个scren,因此我认为
:0.0
更好。但在一个屏幕上,(我尝试)并没有任何附加…谢谢你们的回答,我已经修改了我的问题。但是通知不再出现了。我还尝试添加
&&cd/home/path/
,但没有任何更改。@Guillaume您使用哪个用户的crontab?您是在本地还是在远程服务器上尝试此操作?仅当您在本地为登录用户的crontab执行此操作时,才会显示消息。我正在尝试在本地显示消息,而不是在服务器上。但是我试着用zenity显示一条消息,它正在工作。通知有问题-send@Guillaume我在当地试过,对我来说很有效。脚本和cron条目已经存在。我已在Kubuntu 14.04上为我发送了相同版本的0.7.6
通知发送0.7.6。。。非常奇怪尝试重新安装
libnotify4
Check。我尝试重新安装dbus,libnotify4,但什么也没发生。。。谢谢,这似乎是我的Ubuntu安装中的一个bug。我发现了一个问题,但解决方案对我不起作用。该死!dbus守护进程是否已为您启动?检查脚本中的
sudo service dbus status
,并检查
echo$dbus_SESSION_BUS_ADDRESS
的值,查看它是否与shell的环境值不同。一般来说,cron使用简化的环境集运行,因此cron环境中很可能缺少某些环境变量。因为我在使用ubuntu,而你在kubuntu上,我想这应该是原因。无论如何,我找到了一个解决方案!当我添加时,通知正在工作:
os.environ.setdefault(“DBUS\u SESSION\u BUS\u ADDRESS”,“unix:abstract=/tmp/DBUS-M0JCXXbuhC”)
。但我想我只会为我的电脑工作,这对其他人来说不是一个真正的解决方案。可能使用
尝试notify/except DBUS=“unix:etc”
编辑:抱歉,我没有看到您的回复
45 9 30 6 * export DISPLAY=:0.0 && cd /home/path/ && python script.py >> debug_cron.log 2>&1
45 9 30 6 * cd /home/path/ && python script.py >> debug_cron.log 2>&1
* * * * *  cd /home/user/Desktop/test/send-notify && python script.py
#!/usr/bin/env python

import subprocess
import os

os.environ.setdefault('DISPLAY', ':0.0')
print os.environ

cmd2 = 'notify-send test'
subprocess.call(cmd2, shell=True)
#!/usr/bin/env python

import pynotify
import os

os.environ.setdefault('DISPLAY', ':0.0')

pynotify.init("Basic")
n = pynotify.Notification("Title", "TEST123")
n.show()
* * * * *  cd /home/user/Desktop/test/send-notify && python script.py