2016-09-29 11 views
-1

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秒です。 なぜ出力がインスタンスではないのか分かりません。 またはどうすれば元気にすることができますか?

+0

おそらくバッファリングに問題があります。これは役立つかもしれません:http://stackoverflow.com/questions/1183643/unbuffered-read-from-process-using-subprocess-in-python – cdarke

+0

@cdarkeはサブプロセスやファイルに苦しんでいますか? bufsize = 0に設定しました。 – worldterminator

+0

あなたは受け入れられた答えをリンクで読んだことがありますか? – cdarke

答えて

0

cdarkeが言及しました。このプログラムはバッファリングに苦しんでいます。 しかし、Python 2.xのバグによく似ています。 ロジックは現在のプログラムで何も問題ありません。

問題を解決するには、stdoutを再度開く必要があります。

def thread_print_stream(out_stream): 
    def helper(s): 
    print "start",time.gmtime() 
    for line in io.open(out_stream.fileno()): 
     print line 
    print "finished",time.gmtime() 
    thread.start_new_thread(helper,(out_stream,)) 

そして、サブプロセスが終了する前に、必ずエラーなしの上昇を作るために、

stdin_main.close() 
stdout_main.close() 

を追加します。以下のコードのように 。

関連する問題