0

gmail の受信トレイで特定のメールをスキャンする python スクリプトを作成しました。そのメールが存在する場合、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 を設計しました。私の問題は、(GUI を持たない) emailReader は正しく実行されますが、GUI.py は実行されないことです。終了ステータス1で終了します。誰かがこの問題に光を当てて、私が間違っていることを説明できますか?

4

1 に答える 1

1

NetworkManager は、X サーバーの外部にある仮想端末で実行されるプロセスです。(たとえば、NetworkManager は起動時にウィンドウ マネージャーが開始される前に開始されます。これらはまったく無関係です)。

したがって、NetworkManager によって開始されたスクリプトは (直接) GUI にアクセスできません。(これは、デスクトップから仮想端末 (例: Ctrl-Alt-1) に変更し、そこから GUI を実行しようとしたときに得られるものと非常によく似ています。「Can'tディスプレイを開く」。

GUI プログラムを開始したい場合、2 つの可能性があります。

  • 通知デーモン (ウィンドウマネージャーのサブプロセス) に GUI を開始するように指示します。
  • GUI に正しいディスプレイ (デスクトップが実行されているディスプレイ) で開始するように指示します。

私は最初の解決策に行きます(通知デーモンはまさにその目的のために設計されています)が、それを行う方法は、使用するウィンドウマネージャーに大きく依存します。

2 番目の解決策はもう少し汚れていて、セキュリティ違反の可能性がありますが、基本的には開始DISPLAY=:0.0 myguiapp.pyする代わりに開始するなどの方法を試してくださいmyguiapp.py(これは、localhost:0.0 で X サーバーを実行していることを前提としています)。仮想端末から DISPLAY 行を使用してコマンドを起動するだけで、これが機能するかどうかを確認できます。実際に使用しているディスプレイを取得するにはecho $DISPLAY、X サーバー内のターミナルで実行するだけです。通常、実行中の Xserver へのリモート接続は無効になっています (権限のないユーザーがデスクトップを引き継ぐことができるためです。新しい GUI プログラムの開始 (これが必要です) からキーロガーのインストールまですべて)。その場合はチェックしてくださいman xhost(または解決策#1に進みます)

アップデート

最初の解決策については、おそらく次のようなライブラリをチェックアウトすることをお勧めします( python-notifyおよびpython-notify2libnotifyに python バインディングがあります)。

単純な「通知ポップアップ」以上のものが必要な場合は、おそらくD-BUSを掘り下げる必要があります。簡単な例 (ただし、個人的にはテストしていません) は、ここにあります。

于 2013-01-12T15:47:24.350 に答える