2013-01-12 109 views
0

我已經編寫了一個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

爲什麼你在一個地方調用'python',在另一個地方調用'python3.2'? – tacaswell

+0

當你直接從shell執行'python3.2/home/rahul/python/expensesheet/GUI.py'時,你會得到預期的輸出嗎? – Suku

回答

1

NetworkManager是一個在X服務器之外的虛擬終端上運行的進程。 (例如,NetworkManager get在您的窗口管理器啓動之前在啓動時啓動;它們完全無關)。

因此,由NetworkManager啓動的任何腳本都不會(直接)能夠訪問GUI。 (它與您從桌面切換到虛擬終端(例如Ctrl-Alt-1)時獲得的結果非常相似,然後嘗試從此處運行GUI:您很可能會收到「Can not打開顯示」。

,如果你想開始一個GUI程序,你有2種可能性

  • 告訴通知守護程序(你的窗口管理器的子進程)啓動GUI
  • 告訴你的圖形用戶界面在正確的顯示器上運行(桌面運行的那個)

我會爲第一個解決方案(通知守護程序是專門爲此目的而設計的),但如何去做,很大程度上取決於您使用的窗口管理器。第二種解決方案有點髒,涉及潛在的安全漏洞,但基本上嘗試一些東西,如啓動DISPLAY=:0.0 myguiapp.py而不是啓動myguiapp.py(假設您在本地主機上運行X-server:0.0)。 您可以通過簡單地從虛擬終端啓動帶有DISPLAY行的命令來檢查這是否正常工作。 以獲得您實際使用的顯示,只需在您的X服務器內的終端中運行echo $DISPLAY即可。 通常情況下,遠程連接對您運行的Xserver是禁用的(因爲它允許無計劃的用戶接管您的桌面 - 從啓動新的GUI程序(這是您想要的)到安裝鍵盤記錄程序);如果是這樣的話檢查man xhost(或去解決#1)

UPDATE

爲第1解決方案,你可能要檢查出庫像libnotify(有python綁定在python-notifypython-notify2)。

如果您不僅僅需要簡單的「通知彈出窗口」,您可能需要深入探究D-BUS。 一個簡單的例子(雖然沒有親自測試過),可以找到here

+0

謝謝你的回覆。我對虛擬終端和x服務器很無知。我會閱讀有關此問題並解決我的問題。 – user1971707

+0

我試過第二種解決方案。我沒有導出DISPLAY = localhost:0.0,然後運行python腳本。這種方法在虛擬終端上運行良好。但是,添加到NetworkManager腳本時不起作用。我正在使用Ubuntu 12.04與metacity窗口管理器。您能否給我一些關於如何實施您的第一個解決方案的指導? – user1971707

+0

檢查我的更新 –