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

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

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

만약 내가한다면

long_interactive_script.py | tee logfile.txt

Python은 print 문을 4K 버퍼에 넣어 다음을 제공합니다.

아무것도, 아무것도, 아무것도, 아무것도, 말이 많아요! , 아무것도, 아무것도, 단어 중간에 sudo 프롬프트가 있습니다, 아무것도, 아무것도, 많은 텍스트가 있습니다!

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

unbuffer long_interactive_script.py | tee logfile.txt

하지만 이로 인해 내 스크립트의 상호 작용이 중단됩니다. 그래서 스크립트가 깨지면스도힌트, 중지되었습니다.

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파일은 표준 출력으로 리디렉션하는 것보다 약간 더 추악하지만(애플리케이션이 해당 모드에서 유용한 정보를 제공한다고 가정하면) 캐리지 리턴을 자르는 것만으로도 충분합니다.

캐리지 리턴 외에도 편집 문자도 필터링해야 합니다. 예를 참조하세요:

관련 정보