subprocess.Popen
でプロセスを作成し、stdout
を取得します。 stdout
のコンテンツを読んで、別のスレッドでそれを印刷したいのですが。 後でインタラクティブなプログラムを作成する目的から、subprocess.communicate
は使用できません。Pythonでサブプロセスのストリームを読み取る方法は?
基本的な要件は次のとおりです。サブプロセスが何かを出力したら、スレッドはすぐにそれを画面に出力する必要があります。
はここで、「開始」と「終了」は非常に高速である必要があります間のコード
import subprocess
import thread
import time
def helper(s):
print "start",time.gmtime()
while True:
print "here"
print s.next()
print "finished",time.gmtime()
thread.start_new_thread(helper,(out_stream,))
def process_main():
global stdin_main
global stdout_main
p = subprocess.Popen("/bin/bash", shell=False, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, bufsize=0)
stdin_main = p.stdin
stdout_main = p.stdout
th1 = thread_print_stream(stdout_main)
stdin_main.write("ls -la\n")
stdin_main.flush()
time.sleep(30)
p.terminate()
process_main()
時間経過です。しかし、プロセスが終了する前の時間とまったく同じ30秒です。 なぜ出力がインスタンスではないのか分かりません。 またはどうすれば元気にすることができますか?
おそらくバッファリングに問題があります。これは役立つかもしれません:http://stackoverflow.com/questions/1183643/unbuffered-read-from-process-using-subprocess-in-python – cdarke
@cdarkeはサブプロセスやファイルに苦しんでいますか? bufsize = 0に設定しました。 – worldterminator
あなたは受け入れられた答えをリンクで読んだことがありますか? – cdarke