2016-12-25 18 views
1

一般的に、この質問には多くの回答がありますが、どれも行ごとの読み取りに限定されています。たとえば、このコード:Popenの標準出力をリアルタイムでPythonの行ごとに取得する方法はありますか?

def execute(cmd): 
    popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) 
    for stdout_line in iter(popen.stdout.readline, ""): 
     yield stdout_line 

    popen.stdout.close() 
    return_code = popen.wait() 
    if return_code: 
     raise subprocess.CalledProcessError(return_code, cmd) 

しかし、このような例のための出力ライン(ドットが〜10sの中で一度追加された場合)があります。

............................ 

は、彼らが実行するタスクの進行状況を表示します。私は、行が終了するまで出力を止めたくないので、ドット行全体を印刷します。

だから私はときyield stringする必要があります。そこに出力のいずれかのシンボルがあり、より

  • 私は出力(または単に全体の出力)の1024のシンボルのブロックを読み取ることができ

    • 1秒がになりました(問題なく行が終わったかどうか)。

    しかし、私はこれを行う方法がわかりません。

    p.s.多分ダブ。見つけられませんでした。

  • +0

    ファジーなもの。 'StringIO'にリダイレクトしますが、時間/サイズに達したかどうかをチェックするためには、すべてのcpu_clockをチェックする必要があります。この関連ユーザ/アプリケーション出力メソッド。出力がない場合は、リソースを無駄にしないでください!すべてのコマンドやアプリケーションの出力を毎回別々にする必要がありますが、すべての通信にタイマーの 'server'または' client'ベースが必要です。 'RTC'のものが失われているので両方を使うことはできません** – dsgdfg

    答えて

    0

    Linuxの場合は、実行中のコマンドの前にstdbuf -o0を使用して、stdoutをバッファなし(つまり瞬間的)にすることができます。

    関連する問題