천천히 일부 출력을 생성하는 Python 프로그램이 있습니다.
그걸 파일로 담아내고 싶은데, 테일로 라이브로 볼 수도 있겠다는 생각도 들었어요.
그래서 한 터미널에서 나는 다음을 수행하고 있습니다.
python myprog.py > output.txt
그리고 다른 터미널에서 :
tail -f output.txt
하지만 Python 프로그램이 실행되는 동안 꼬리가 나에게 아무것도 표시하지 않는 것 같습니다.
python 스크립트를 종료하기 위해 ctrl-c를 누르면 갑자기 꼬리가 output.txt
채워지기 시작합니다. 그러나 Python이 실행되는 동안에는 그렇지 않습니다.
내가 도대체 뭘 잘못하고있는 겁니까?
답변1
생성 시 파이프되도록 버퍼를 명시적으로 플러시해야 할 수도 있습니다. 이는 일반적으로 파이프의 버퍼가 가득 찼을 때(제가 생각하는 킬로바이트 단위) 출력이 stdin 메시지가 끝날 때만 인쇄되기 때문입니다. 이는 아마도 읽기/쓰기를 절약하기 위한 것입니다. 매 인쇄 후에 이 작업을 수행할 수 있으며, 반복하는 경우 루프 내의 마지막 인쇄 후에 수행할 수 있습니다.
import sys
...
print('Some message')
sys.stdout.flush()
답변2
버퍼링되지 않은 플래그를 사용하여 Python을 실행합니다.
python -u myprog.py > output.txt
그러면 출력이 실시간으로 인쇄됩니다.
답변3
라이브 파일을 추적하는 대신 tee
대신 사용하십시오. 그것은 당신이 하려는 일을 정확하게 수행하도록 만들어졌습니다.
에서남자 티:
tee(1) - Linux 매뉴얼 페이지
이름 tee - 표준 입력에서 읽고 표준 출력 및 파일에 쓰기
개요
tee [OPTION]... [FILE]...
설명
표준 입력을 각 FILE에 복사하고 표준 출력에도 복사합니다.
-a, --append append to the given FILEs, do not overwrite -i, --ignore-interrupts ignore interrupt signals --help display this help and exit --version output version information and exit
FILE이 -이면 표준 출력으로 다시 복사합니다.
따라서 귀하의 경우에는 다음을 실행합니다.
python myprog.py | tee output.txt
편집: 다른 사람들이 지적했듯이 이 답변은 sys.stdout.flush()
Davey의 허용 답변에 설명된 대로 Python 프로그램에서 사용되지 않는 한 OP가 원래 겪었던 것과 동일한 문제가 발생합니다. 이 답변을 게시하기 전에 수행한 테스트는 OP의 사용 사례를 정확하게 반영하지 못했습니다.
tee
최적은 아니지만 파일에 쓰는 동안 출력을 표시하는 방법으로 여전히 사용할 수 있지만 Davey의 대답은 분명히 정확하고 최선의 대답입니다.
답변4
tail을 사용하면 거의 항상 로그 파일(예: 이메일) 메시지를 추적합니다.
이것은 약간 엉뚱할 수도 있지만 print
/ print()
/를 사용하는 대신write()
사용하는 대신 로깅 모듈을 사용하는 것은 어떨까요? (PSL에서) 주의: 기존 로그와 관련된 모든 시간과 ID 코드를 출력하지 않도록 로깅 포맷터를 구성할 수 있습니다.
출력은 (데이터) 파일로 이동하도록 구성할 수 있으며 버퍼링 지연이나 리디렉션이 없기 때문에 tail은 원활하고 즉각적으로 작동합니다.
문안 인사