10

私はpythonスクリプトを使用してプロセスを実行しsubprocess.Popen、同時に出力をテキストファイルに保存し、コンソールに出力しています。これは私のコードです:

result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
for line in result.stdout.readlines(): #read and store result in log file
    openfile.write("%s\n" %line)
    print("%s" %line)

上記のコードは問題なく動作しますが、最初にプロセスを完了し、結果変数に出力を格納します。その後、for ループは出力を保存するだけでなく、出力します。

しかし、実行時に出力が必要です (プロセスが完了するまでに数時間かかる可能性があるため、これらすべての時間の出力は得られません)。

したがって、出力を動的に(実行時に)提供する他の関数はありますか。つまり、プロセスが最初の行を提供するとすぐに、それが印刷されるはずです。

4

3 に答える 3

7

ここでの問題は.readlines()、完全なリストを構築するため、戻る前に出力全体を取得することです。直接繰り返すだけです:

for line in result.stdout:
    print line
于 2013-05-15T06:52:46.523 に答える
4

.readlines()開いている間にプロセスが返すすべての行のリストを返します。つまり、サブプロセスからのすべての出力を受け取るまで何も返しません。「リアルタイム」で行ごとに読み取るには:

import sys
from subprocess import Popen, PIPE

proc = Popen(cmd, shell=True, bufsize=1, stdout=PIPE)
for line in proc.stdout:
    openfile.write(line)
    sys.stdout.buffer.write(line)
    sys.stdout.buffer.flush()
proc.stdout.close()
proc.wait()

注: サブプロセスが非対話モードで実行されているときにブロック バッファリングを使用する場合。モジュールまたはコマンド必要pexpectになる場合がptyあります。stdbufunbufferscript

iter()注: Python 2 では、 「リアルタイム」出力を取得するために ,も使用する必要がある場合があります。

for line in iter(proc.stdout.readline, ""):
    openfile.write(line)
    print line,
于 2013-05-15T09:17:31.403 に答える