ラズベリーパイに起動/ログインするときにキーボードをポーリングする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が再実行を試み、.profile
Pythonスクリプトが終了しないため、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
rsync
2番目の提案は、サービスを実行しているプログラム(または)などのリモートログインを処理するため、より安全になります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