.profileでプログラムを実行すると、GUI startxがブロックされます。

.profileでプログラムを実行すると、GUI startxがブロックされます。

ラズベリーパイに起動/ログインするときにキーボードをポーリングするPythonプログラムを実行したいと思います。

以前の試みには、cronジョブ(標準入力または標準出力が欠落しているため失敗)が含まれていました。

rc.localまた、標準入力がないため失敗しました(永遠のループに閉じ込められました。それ脱出は楽しいです)

だから私はコマンドを.profileに入れましたが、本当にうまくいくようです! Piがオンになると、プログラムは期待どおりに正しく実行されます。しかし、...

GUIから起動しようとすると、startx画面が黒くなり、まったく起動しません。これはPpythonプログラムに関連しているようです。bash.profileからこれを削除すると、すべてがうまく機能するためです。

どんな助けでも大変感謝します!

修正する

LED(単純な赤、黄色、緑のシーケンス)にも出力するスクリプトを作成し、.profileが実行されているようです。再びいつstartx実行されますか?それではなぜ?

以下は私の.profileコードで、私のPythonプログラムは次のようになります。 Pythonスクリプトのポイントは次のとおりです。永久に繰り返される stdin/keyboard で終了したスレッドを実行します。

等高線

echo "About to run keyboard polling"; sleep 3
python /home/pi/poll_keyboard.py

poll_keyboard.py

import thread
import time
def input_thread(L):
    key = raw_input()
    L.append(key)
    thread.exit() #Should close thread at end
def do_print():
    L = []
    thread.start_new_thread(input_thread, (L,))
    i = 0
    while True:
        print "Hello World %d" % i
        if L: #If anything has been detected
            break
        i += 1
        time.sleep(0.5)
    return L
key = do_print()
print "Key press detected: %s. Exiting in 2" % key
time.sleep(2)
exit()

ベストアンサー1

ここで何が起こるのかは、コマンドラインから始めてstartx準備ができたら呼び出すことです。経験的に、GUIが再実行を試み、.profilePythonスクリプトが終了しないため、GUIが中断されると仮定します。

試してみる1つの解決策は、コードが一度だけ実行されるように環境変数を設定することです。

# This is .profile
#
if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}"
then
    # Protected code here will be called only once
    #
    echo "About to run keyboard polling"; sleep 3
    python /home/pi/poll_keyboard.py

    export DONE_PROFILE="${USER:-unknown}"
fi

別のオプションは、次の場合にのみコードを呼び出すことです。標準入力ターミナルに接続:

# This is .profile
#
if test -t 0 -a -t 1
then
    # Protected code here will be called only if stdin and stdout is a tty
    #
    echo "About to run keyboard polling"; sleep 3
    python /home/pi/poll_keyboard.py
fi

rsync2番目の提案は、サービスを実行しているプログラム(または)などのリモートログインを処理するため、より安全になりますscp

コードが一度だけ考慮され、次の場合にのみ実行されるように、2つを組み合わせることもできます。標準入力そして標準出力端末に接続してください。 (if...fi文を入れ子にするだけです。)


test最初の例では、コードを保護するための条件を説明するように求められました。

if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}"

これは英語で ""と書くことができます。$DONE_PROFILE空または$DONE_PROFILE一致するものがない場合$USER...」。

空または設定されていない場合、この${USER:-unknown}構文はそれを上書きします。unknown$USER

この場合、X式の両側に配置するのは!=おそらく不要ですが、これは防御的なスクリプトアプローチから来ています。$A値を持つ変数-z$B値を持つ他の変数を考えてみましょうapple。一部のシェルでは構文が無効なtest "$A" != "$B"ため、書き込みが拡張されます。test -z != apple両側にプレフィックスを付けると拡張が構文的に安全にXなります。test X-z != Xapple

おすすめ記事