리눅스 티가 파이썬에서 작동하지 않습니까?


103

무한 루프를 사용하여 웹 서버와 통신하는 파이썬 스크립트를 만들었습니다. 모든 통신 데이터를 파일에 기록하고 동시에 터미널에서 모니터링하고 싶습니다. 그래서 이렇게 tee 명령을 사용했습니다.

python client.py | tee logfile

그러나 터미널이나 로그 파일에서 아무것도 얻지 못했습니다. 파이썬 스크립트가 잘 작동합니다. 여기서 무슨 일이 일어나고 있습니까? 내가 뭔가를 놓치고 있습니까?

몇 가지 조언을 주시면 감사하겠습니다. 미리 감사드립니다.


3
버퍼링은 파이프와 터미널에 대해 다르게 작동합니다. sys.stdout.flush()줄을 기록 할 때마다 스크립트에서 명시 적 작업을 수행해야 할 수도 있습니다 .
Lukas Graf 2014

다른 방법으로는 버퍼링 출력 참조 트리거 할 수 stackoverflow.com/q/107705/1328439
드미트리 Chubarov

답변:


179

에서 man python:

   -u     Force stdin, stdout and stderr to  be  totally  unbuffered.   On  systems
          where it matters, also put stdin, stdout and stderr in binary mode.  Note
          that there is internal buffering in xreadlines(), readlines()  and  file-
          object  iterators  ("for  line  in sys.stdin") which is not influenced by
          this option.  To work around this, you will want to use  "sys.stdin.read‐
          line()" inside a "while 1:" loop.

따라서 할 수있는 일은 다음과 같습니다.

/usr/bin/python -u client.py >> logfile 2>&1

또는 사용 tee:

python -u client.py | tee logfile

1
대안은를 사용하는 것입니다 script. 이는 또한 버퍼링을 비활성화하고 제어 시퀀스 ( C-a, 커서 키 등)가 추가로 작동하도록합니다 : stackoverflow.com/a/39269661/15690 .
blueyed

우수한! Raspbian Jessie가 장착 된 Raspberry Pi 3의 Python 3에서도 작동했습니다. python3 -u client.py | 티 로그 파일
ANTONINO

참고 : Python은 다른 여러 명령과 마찬가지로 stdin 및 stdout이 콘솔 인 경우 버퍼링 된 줄을 사용하지만 결과가 파일 또는 파이프로 리디렉션되는 경우 전체 버퍼링됩니다. tee하이브리드가 아닌 파이프처럼 보입니다. 콘솔에 씁니다. 참고 :이 동작은 파이썬 프로그램 내에서도 제어 할 수 있습니다.
Giacomo Catenazzi

또 다른 메모 : python -u client.py | tee >> logfile작동하지 않습니다. 는 >>파일에 버퍼 쓰기의 또 다른 사례를 소개한다. 그것이 tee -a해결되는 것입니다.
tanius 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.