我编写了一个python脚本,用于扫描我的gmail INBOX中的特定邮件,如果该邮件存在,则会打开一个GUI。我测试了这个脚本并且正常工作。 我想在建立网络连接时运行此脚本。所以,我在NetworkManager的dispatch.d目录中添加了一个脚本。我的bash脚本如下所示。
#!/bin/bash
#/etc/NetworkManager/dispatcher.d/90filename.sh
IF=$1
STATUS=$2
if [ "$IF" == "wlan0" ]; # for wireless internet
then
case "$2" in
up)
logger -s "NM Script up triggered"
python /home/rahul/python/expensesheet/emailReader.py
logger -s "emailReader completed"
exitValue=$?
python3.2 /home/rahul/python/expensesheet/GUI.py &
logger -s "GUI completed with exit status $exitValue"
;;
down)
logger -s "NM Script down triggered"
#place custom here
;;
pre-up)
logger -s "NM Script pre-up triggered"
#place custom here
;;
post-down)
logger -s "NM Script post-down triggered"
#place custom here
;;
*)
;;
esac
fi
我用tkinter来设计我的GUI。 我的问题是,emailReader(没有GUI)被正确执行,但GUI.py没有被执行。它以退出状态1退出。 有人可以对这个问题有所了解并解释我做错了吗?
答案 0 :(得分:1)
NetworkManager是在X服务器外部的虚拟终端上运行的进程。 (例如,在窗口管理器启动之前,NetworkManager将在启动时启动;它们完全不相关)。
因此,NetworkManager启动的任何脚本都不会(直接)访问GUI。 (它与您从桌面更改为虚拟终端(例如Ctrl-Alt-1)时所获得的非常类似,然后尝试从那里运行GUI:您很可能会收到类似“不能”的错误打开显示“。
如果你想启动一个GUI程序,你有两种可能性
我会选择第一个解决方案(通知守护程序是为此目的而设计的),但是如何做到这一点在很大程度上取决于你使用的窗口管理器。
第二个解决方案有点脏,涉及潜在的安全漏洞,但基本上尝试启动DISPLAY=:0.0 myguiapp.py
而不是启动myguiapp.py
(假设您在localhost上运行X服务器:0.0) 。
您可以通过从虚拟终端启动带有DISPLAY行的命令来检查是否有效。
要获得您实际使用的显示,只需在X服务器的终端中运行echo $DISPLAY
即可。
通常,远程连接被禁用到正在运行的Xserver(因为它允许没有特权的用户接管你的桌面 - 从启动新的GUI程序(你想要的)到安装键盘记录器);如果是这种情况,请检查man xhost
(或寻求解决方案#1)
<强>更新强>
对于第一个解决方案,您可能想要查看像libnotify
这样的库(python-notify和python-notify2中有python绑定)。
如果你想要的不仅仅是简单的“通知弹出窗口”,你可能需要深入研究D-BUS。 一个简单的例子(尽管没有亲自测试过),可以找到here。