python通知模块&;克朗:吉奥,错误
我正在请求一些帮助来使用显示通知,因为我尝试过的一切都不起作用。当cron启动脚本时,显示未初始化。当我手动启动它时,这就是工作。 我尝试过的代码: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
#!/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