3

私はひどく明白な何かを見落としているに違いありません。Cプログラムを実行し、その出力をリアルタイムで表示し、最後に最後の行を解析する必要があります。これは、印刷される最後の行が常に同じであるため、簡単なはずです。

process = subprocess.Popen(args, shell = True,  
                           stdout = subprocess.PIPE, stderr = subprocess.PIPE)

# None indicates that the process hasn't terminated yet.
while process.poll() is None:

    # Always save the last non-emtpy line that was output by the child
    # process, as it will write an empty line when closing its stdout.
    out = process.stdout.readline()
    if out:
        last_non_empty_line = out

    if verbose:
        sys.stdout.write(out)   
        sys.stdout.flush()

# Parse 'out' here...

ただし、最後の行が印刷されない場合があります。Popensのbufsizeのデフォルト値は0であるため、バッファリングされていないことになっています。また、終了する直前にCコードにfflush(stdout)を追加しようとしましたが、プログラムを終了する前にストリームをフラッシュする必要はまったくないようです。

アイデアは誰ですか?

4

2 に答える 2

3

問題は、プロセスが終了するまで行を読み込んでいることです ( process.poll())。シェル フラグのためにバッファリングを使用しています。

ファイルの終わりまたは空の行に到達するまで、process.stdout を読み続ける必要があります。

于 2010-03-12T12:36:23.823 に答える
2

readline()改行を待って、テキストをバッファリングする必要があります。

常に競合状態が発生します-バッファリングされていないストリームの量は、行を処理し、終了を確認してから行を読み取るという事実を処理しません。したがって、行の処理中にサブプロセスが終了した場合、あなたは他に何も読まないでしょう。さらに、シェルはおそらく独自のバッファリングを導入しています。

したがって、次のいずれかを実行できます。

  1. サブプロセスの実行中に冗長出力を使用communicate()して放棄します。

  2. プロセスが終了した後、EOF になるまで読み続けてください。

を使用する必要がないようにコードを変更することもお勧めしますshell=True

于 2010-03-12T12:34:14.400 に答える