`pv`の出力をPythonスクリプトに送り、一度に1行ずつ進行状況を出力するにはどうすればよいですか?

`pv`の出力をPythonスクリプトに送り、一度に1行ずつ進行状況を出力するにはどうすればよいですか?

私はそれを使ってtar数千の小さなファイルをすばやくコピーし、パイプを介してコピーのpv進行状況と速度を示します。

$ sudo tar c --files-from /tmp/camfilenames | 
  pv --width 40 | 
  sudo tar x -C /home/pi/test

...これはうまくいきます。出力例:

191MiB 0:00:03 [58.1MiB/s] [<=>       ]

...ターミナルで。しかし、この出力でより多くのことをしたいと思います。簡単なPythonスクリプトがあります/home/pi/screentest.py

import sys
print "start"
for line in sys.stdin:
    print "line: " + line
print "end"

テスト実行:

$ (   sudo tar c --files-from /tmp/camfilenames | 
      pv --width 40 | 
      sudo tar x -C /home/pi/test   ) | 
   python /home/pi/screentest.py

出力:

start
191MiB 0:00:03 [55.1MiB/s] [<=>       ]
end

バッファ内のすべてが返されることがわかっているので、どのように強制的にpv1行ずつ戻って、毎回バッファをフラッシュして次のように出力することができますか?

start
line: 0MiB 0:00:00 ...
line: 60MiB 0:00:01 ...
line: 120MiB 0:00:02 ...
line: 191MiB 0:00:03 ...
end

ベストアンサー1

pv進行状況をstderrに出力するため、Pythonスクリプトのパイプはから印刷されませんpvend出力が停止した後に印刷されます。それはおそらくそれまでの最後の出力が終了し、スクリプトのstdinが閉じられたからです。pvtar

次のようなものが必要な場合があります。

( sudo tar c --files-from /tmp/camfilenames | 
  pv --width 40 -f | 
  sudo tar x -C /home/pi/test ) 2>&1 >/dev/null | python /home/pi/screentest.py

tarパイプのstdoutを破棄し、代わりにstderrをpythonsスクリプトに送信します。 stderrが端末でない場合は進行がないため、pv進行状況を出力するには強制する必要があります。-fpv

pvしかし、のオプションを確認したいかもしれません--format。次のようなものを使用できます。

sudo tar c --files-from /tmp/camfilenames | 
  pv --width 40 --format $'%b %t\n' | 
  sudo tar x -C /home/pi/test

同様の出力を得るために。

おすすめ記事