2009-07-20 10 views
2

私が書いているPyQt GUIアプリケーションで簡単な(ウィンドウズ)コマンドラインツールを実行しようとしています。私が持っている問題は、コマンドラインツールは、それが進捗状況をstdoutに投げることです(サーバーリセットコマンドで、「停止しようとしました」と「再起動する」タイプの出力が得られる)。Python Printing StdOut As Received

私がしようとしているのは、出力は、私は私のアプリの一部としてそれを表示することができ、私はそれには、次のような何かを非常に簡単になり仮定:

import os 
import subprocess as sub 
cmd = "COMMAND LINE APP NAME -ARGS" 
proc = sub.Popen(cmd, shell=True, stdout=sub.PIPE).stdout 
while 1: 
    line = proc.readline() 
    if not line: 
     break 
print line 

これは部分的に私がSTDOUTの内容を取得行う代わりとしてのことで動作しますコマンドラインアプリケーションが終了すると進捗メッセージが送信され、一度にStdOutをフラッシュするようです。

isr簡単な答え?

+0

重複:http://stackoverflow.com/questions/527197/intercepting-stdout-of-a-subprocess-while-it-is-running –

答えて

0

私は質問を理解していますか? 私は、あなたが "エコーを最初にする、60を寝返らせる、エコーを続ける"のようなものを実行していると思うし、 "第2"の "先頭"を先取りしたいと思っています。

問題が発生している理由は、オペレーティングシステムがプロセスの出力をそのメモリに保存しているためです。バッファがいっぱいになった場合、または他のプログラムが終了した場合には、出力をプログラムに送信するだけの手間がかかります。だから、私たちはO/Sを掘り下げ、それをどう言うかを理解する必要があります。これは、一般に、非同期モードまたは非ブロックモードと呼ばれます。

幸いにも誰かが私たちのために頑張ってくれました。 この男は、pythonビルトインのPopenクラスにsend()とrecv()メソッドを追加しました。 コメントの中に見つかったバグを修正したようです。

それを試してみてください: http://code.activestate.com/recipes/440554/