5

キーボードからの入力を取得するためにいくつかのコードを記述し、何かが生きているかどうかも確認します。

import sys
from select import select

timeout = 10
while is_alive(): # is_alive is a method to check some stuffs, might take 5 secs
    rlist, _, _ = select([sys.stdin], [], [], timeout)
    if rlist:
        s = sys.stdin.readline()
        print repr(s)
        handle(s) # handle is a method to handle and react according to input s

キーボード入力が待機時間外に終了するとselect()(通常は5秒間で終了しますis_alive())、はif rlist:falseになることがわかりました。

理由はわかりますが、解決方法がわかりません。

また、上記の状況に関連する別の質問があります。readline()一部の入力が異なるselect()待機中に配置されている場合、入力の最後の行が返されることがあります。

つまり、「abc \ n」と入力し、残念ながら「\ n」を入力するとselect()(つまり、Enterキーを押すと、プログラムはなどの他の部分を実行します)、 「def」is_alive()と入力すると\ n'そして今度はEnterキーが正常に押されたselect()ので、sfromreadline()' def \ n'になり、最初の行が消えます。

上記の2つの問題を解決するための良い解決策はありますか?私はFreeBSD9.0を使用しています。

4

1 に答える 1

2

is_alive()呼び出しのコードとしてssh、これはstdinを使い果たします。

オプションまたはリダイレクトされたものから始めsshてみてください。-nstdin

後者は

sp = subprocess.Popen(..., stdin=subprocess.PIPE)
sp.stdin.close()
于 2012-12-06T08:44:24.303 に答える