2016-09-01 10 views
2

操作の進捗状況を得るためにpython内からプログラムpvを使用する方法はありますか?pythonを使用してpvの出力を取得

これまでのところ、私は次のようしている:

p0 = sp.Popen(["pv", "-f", args.filepath], 
        bufsize=0, 
        stdout=sp.PIPE, 
        stderr=sp.PIPE) 
    p1 = sp.Popen(["awk", "{print $1, $2, $1, $3, $4 }", "{}".format(args.filepath)], 
        stdout=sp.PIPE, 
        stdin=p0.stdout) 

しかし、私はp0からの連続出力を得るトラブルを抱えています。

for line in p0.stderr: 
     print("line:", line) 

をしかし、これは、プロセスが終了するのを待ち、その後のみpvからの最後の進捗報告を出力します。私は試してみました。継続的に更新されるステータスをどのように印刷することができるのか誰にも分かりますか?

答えて

1

をstderrに書き込み、それは最後にキャリッジリターン(\r)との各ラインをpv出力が判明。このように、連続universal_lines=Trueで初期化する必要がPopen出力から読むことができるようにするには:

p0 = sp.Popen(['pv', '-f', args.filepath], 
        stdout=sp.PIPE, 
        stderr=sp.PIPE, 
        universal_newlines=True) 

これは、進捗報告の連続出力につながる:ここ

line: 7.12MB 0:00:01 [ 7.1MB/s] [=>         ] 8% ETA 0:00:11 

line: 14.6MB 0:00:02 [7.42MB/s] [====>        ] 16% ETA 0:00:10 

line: 22.1MB 0:00:03 [7.55MB/s] [=======>       ] 24% ETA 0:00:09 

line: 29.5MB 0:00:04 [7.36MB/s] [==========>       ] 33% ETA 0:00:08 

への参照です同様の質問:

Real time output of subprocess.popen() and not line by line

-1

このようなものを試してみてください。

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

for line in iter(p.stdout.readline, ''): 
    print("line", line) 
+0

が、これは効果的に私が持っているものと同じではありませんか?どちらの場合でも、動作していないようです。 –

0

p0.stderrからPVの葉をそのまま標準出力読んでみてください、それだけで

+0

それは私が試みていることです(私の記事の2番目のコードブロック参照)。 –

+0

うわー、私はあなたのブロックと最初のコメントを混ぜ...私の悪い – mrtvfuencxozd

関連する問題