`pv`의 출력을 Python 스크립트로 보내고 한 번에 한 줄씩 진행 상황을 출력하려면 어떻게 해야 합니까?

`pv`의 출력을 Python 스크립트로 보내고 한 번에 한 줄씩 진행 상황을 출력하려면 어떻게 해야 합니까?

나는 이를 사용하여 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

버퍼에 있는 모든 것이 반환된다는 것을 알고 있으므로 pv어떻게 강제로 한 줄씩 뒤로 돌아가서 매번 버퍼를 플러시하여 다음과 같이 출력하도록 할 수 있습니까?

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 스크립트에 대한 파이프는 에서 인쇄되지 않습니다 pv. end출력이 중지된 후에 인쇄됩니다. 아마도 그때까지 마지막 출력이 종료되어 스크립트의 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

비슷한 출력을 얻으려면.

답변2

@muru에게 감사드립니다. 귀하의 솔루션을 시도했지만 동시에 PV가 한 줄을 지속적으로 업데이트하는 대신 새 줄을 출력하도록 강요하는 것이 주요 문제라는 것을 발견했습니다.

그래서 나는 이렇게 썼습니다:

$ tail -f /home/pi/log | pv -f |& stdbuf -oL tr '\r' '\n'

작동했으므로 이제 문제는 각 줄에서 작업을 수행하기 위해 Python 스크립트를 호출하는 방법입니다. do-while 루프를 사용하여 이 작업을 수행할 수 있다는 것을 알았습니다.

$ tail -f /home/pi/log | pv -f |& stdbuf -oL tr '\r' '\n' | (while read -r LINE; do echo $LINE; done;)

그래서 저는 Python 스크립트(작은 LCD 핸들러)를 사용하여 LCD에 PV 상태를 표시합니다.

tail -f /home/pi/log | pv -f --width 20 -i 2 |& stdbuf -oL tr '\r' '\n' | (while read -r LINE; do python /home/pi/screen.py $LINE; done;)

많은 작은 파일을 복사하여 TAR 스크립트를 다시 도입했습니다.

$ (sudo tar c --files-from /tmp/camfilenames | pv -f --width 20 -i 1 | sudo tar x -C /home/pi/test) |& stdbuf -oL tr '\r' '\n' | (while read -r LINE; do python /home/pi/screen.py $LINE; done;)

그래서 결국 PV에 더 많은 매개변수를 추가하고 문자열을 교체하고 PV 출력을 LCD에 보내기 전에 줄 바꿈을 추가했을 때 다음과 같은 결과가 나왔습니다.

cd /home/pi/cam \ && ( \ sudo tar c --files-from /tmp/camfilenames \ | pv -f -s $( \ du -sb /home/pi/cam \ | awk '{print $1}' \ ) --width 64 -i 5 \ | sudo tar x -C /mnt/usb \ ) \ |& stdbuf -oL tr '\r' '\n' \ | ( \ while read -r LINE; \ do LINE="${LINE// /_}"; \ LINE="${LINE//_\[/ [}"; \ LINE="${LINE//\]_/] }"; \ lcd $LINE; \ done; \ ) \ && cd /home/pi

PV 출력이 LCD에 나타나는 방식은 다음과 같습니다. PV 출력이 LCD에 나타나는 방식입니다.

관련 정보