我编写了一个python脚本,它扫描我的gmail收件箱中的特定邮件,如果该邮件存在,它会打开一个GUI。我已经测试了这个脚本和工作正确。我想在网络连接建立时运行这个脚本。因此,我在分派中添加了一个脚本。NetworkManager. 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退出。有人能解释一下这件事吗?我做错了什么?
NetworkManager是在X-server之外的虚拟终端上运行的进程。(例如,NetworkManager在窗口管理器启动之前启动;
因此,任何由NetworkManager启动的脚本都不能(直接)访问GUI。(这非常类似于你从桌面切换到虚拟终端(例如Ctrl-Alt-1),然后尝试从那里运行你的GUI:你很可能会得到一个错误,如"不能打开显示"。
如果你想启动一个gui程序,你有两种可能
- 告诉通知守护进程(窗口管理器的子进程)启动GUI
- 告诉你的GUI在正确的显示器上启动(你的桌面正在运行的那个)
我选择第一个解决方案(通知守护进程就是为此目的而设计的),但是如何做到这一点,很大程度上取决于您使用的窗口管理器。
第二个解决方案有点脏,涉及潜在的安全漏洞,但基本上可以尝试启动DISPLAY=:0.0 myguiapp.py
而不是启动myguiapp.py
(这假设您在localhost:0.0上运行X-server)。您可以通过在虚拟终端上简单地使用DISPLAY-line启动命令来检查这是否有效。要获得实际使用的显示,只需在X-server的终端中运行echo $DISPLAY
。通常,禁止远程连接到正在运行的Xserver(因为它允许未配置的用户接管您的桌面—从启动新的gui程序(这是您想要的)到安装键盘记录程序);如果是这种情况,检查man xhost
(或去解决方案#1)
对于第一种解决方案,您可能想要检查libnotify
之类的库(在python-notify和python-notify2中有python绑定)。
如果你想要的不仅仅是简单的"通知弹出",你可能必须深入研究D-BUS。可以在这里找到一个简单的示例(但我没有亲自测试过)。