1

こんにちは、私はttyに住み、入力と出力をフィルタリングする2番目のttyを生成できる疑似端末を書いています

私は今のところPythonで書いています.2番目のttyを生成し、読み書きは簡単です

しかし、私が読んだとき、読み取りは終了せず、さらに入力を待ちます。

import subprocess

pfd = subprocess.Popen(['/bin/sh'], shell=True, 
    stdout=subprocess.PIPE, stdin=subprocess.PIPE)

cmd = "ls" 

pfd.stdin.write(cmd + '\n')

out = ''
while 1: 
    c = pfd.stdout.read(1)
    if not c: # if end of output (this never happends)
        break 
    if c == '\n': # print line when found
        print repr(out)
        out = ''
    else:
        out += c

----------------------------- 出力 -------------------- ----

intty $ python intty.py 
'intty.py'
'testA_blank'
'testB_blank'
(hangs here does not return)

バッファの終わりに達しているように見え、 None または '' を返す代わりに、次の入力を待ってハングします。

出力が完了したかどうかを確認するには、何を探す必要がありますか? バッファの終わり?印刷できない文字?

- - - - - - - - 編集 - - - - - - -

これは、ls の代わりに xpcshell を実行したときにも発生します。これらの対話型プログラムには、プロンプトを再度表示する方法があると想定しています。不思議なことに、プロンプトです。この場合、「js>」は表示されません。

4

2 に答える 2

1

さて、あなたの出力は実際には完了していません。を生成/bin/shしたため、「ls」が完了した後もシェルは実行されています。まだ実行中なので、EOF インジケータはありません。

単に実行してみません/bin/lsか?

次のようなことができます

pfd = subprocess.Popen(['ls'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)

out, err_output = pfd.communicate()

subprocess.communicateこれは、単一のプログラム実行から出力を取得するより安全な方法 (メモリに収まる出力の場合)も強調表示します。これは、プログラムの実行が終了したときにのみ返されます。

あるいは、シェルから行ごとに読み取ることもsh~#できますが、プログラム出力に簡単に表示される行のような特別なシェル シーケンスを探すことになります。したがって、シェルを実行することはおそらく悪い考えです。


編集これが私が言及していたものですが、多くの注意事項があるため、実際には最善の解決策ではありません:

while 1: 
    c = pfd.stdout.read(1)
    if not c:
        break
    elif c == '\n': # print line when found
        print repr(out)
        out = ''
    else:
        out += c
        if out.strip() == 'sh#':
            break

これは、他のコマンドが行の先頭に「sh#」を出力した場合に発生することに注意してください。また、何らかの理由で出力が予想と異なる場合は、以前と同じブロック状態になります。これが、シェルにとって非常に最適ではない状況である理由です。

于 2010-02-17T03:42:15.400 に答える
0

シェルのようなアプリケーションの場合、出力はシェルが終了するまで終了しません。を使用select.select()して、待機中の出力があるかどうかを確認するか、プロセスを終了します。

于 2010-02-17T03:42:03.387 に答える