0

重複の可能性:
サブプロセスの stdout を 1 行ずつ読み取る

Linux コンソールで大量のテキストを生成する C++ プログラムを作成しました。

この C++ の出力を解析するために Python スクリプトを使用しています。私はこれをそのようにやっています:

cmd = ["./starter"] 

p = subprocess.Popen(cmd, 
    stdout=subprocess.PIPE)

for line in p.stdout:

    strLine = str(line).rstrip()
    print(">>> " + strLine )

これは機能しています。しかし、大きな問題があります。出力がライブではありません。つまり、スクリプトを開始した後は何も出力されませんが、数秒後にのみ出力されます..ほとんどの場合、Pythonは最大文字数を待ってから一度にすべてを出力します...

C++プログラムによって印刷されたようにすぐに行を印刷するようにpythonに指示する方法はありますか?

4

1 に答える 1

1

stdoutファイルをイテレータとして使用していて、大きなバッファを使用しているため、印刷が遅れています。.readline()代わりに使用してください。iter()センチネルを使用してループにすることもできます:

for line in iter(p.stdout.readline, ''):
    strLine = str(line).rstrip()
    print(">>> " + strLine )

flush=Trueprint 関数呼び出しに追加することもできます。

print(">>> " + strLine, flush=True)

または、Python 3 ではなく Python 2 (は関数ではなくステートメント) を使用している場合は、バッファprintを直接フラッシュできます。stdout

import sys

sys.stdout.flush()

デフォルトでstdoutは、行バッファリングされているため、通常、python は改行を出力するたびにバッファをフラッシュする必要があります。

于 2013-01-30T10:03:15.273 に答える