대화형 스크립트에서 티가 포함된 실시간 인쇄 문

대화형 스크립트에서 티가 포함된 실시간 인쇄 문

long_interactive_script.py수천 개의 명령문이 포함된 프로그램이 있습니다 print. tee출력을 저장할 수 있도록 프로그램을 (또는 다른 방법으로) 파이프하고 싶습니다 .

만약 내가한다면

long_interactive_script.py | tee logfile.txt

Python은 인쇄 문을 4K 버퍼에 저장하여 다음을 얻습니다.

아무것도, 아무것도, 아무것도, 아무것도, 텍스트가 너무 많아요!, 아무것도, 아무것도, 단어 중간에 sudo 프롬프트가 있고, 아무것도, 아무것도, 텍스트가 너무 많아요!

버퍼를 피하기 위해 다음을 시도했습니다.

unbuffer long_interactive_script.py | tee logfile.txt

하지만 이로 인해 내 스크립트의 대화형이 중단됩니다. 따라서 스크립트가sudo프롬프트되면 정지됩니다.

참고: sudo스크립트를 실행하기 전에는 간단하게 작업할 수 없습니다. 대화형 스크립트는 일부 실행에만 필요하며 필요하지 않은 경우에는 sudo묻고 싶지 않습니다 .sudo

더...

stdbuf -oL long_interactive_script.py | tee -a logfile.txt

어느 정도 작동합니다. 원하는 데이터를 모두 얻었지만 다음 오류도 발생합니다.

ERROR: ld.so: object '/usr/lib64/coreutils/libstdbuf.so' from LD_PRELOAD cannot be preloaded: ignored.

답변1

Python의 표준 출력 스트림에 대해 크기가 0인 버퍼를 지정합니다. -u플래그나 다음 명령문을 사용 하여 Python을 호출하여 이를 수행할 수 있습니다 .

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

답변2

그럼에도 불구하고 버퍼링에 대한 해결 방법은 다른 사람들이 사용하는 이유입니다.script, 대화형 프롬프트를 방해하지 않고 터미널에 작성된 모든 문자를 캡처합니다.

결과 typescript파일은 표준 출력으로 리디렉션하는 것보다 약간 더 추악하지만(응용 프로그램이 해당 모드에서 유용한 정보를 제공한다고 가정하면) 캐리지 리턴 문자를 자르는 것만으로도 충분합니다.

캐리지 리턴 외에도 필터링할 편집 문자가 있습니다. 예를 들면 다음을 참조하세요.

관련 정보