linux tee nie działa z Pythonem?

103

Zrobiłem skrypt w Pythonie, który komunikuje się z serwerem WWW za pomocą nieskończonej pętli. Chcę rejestrować wszystkie dane komunikacyjne do pliku, a także monitorować je z terminala w tym samym czasie. więc użyłem polecenia tee w ten sposób.

python client.py | tee logfile

jednak nie mam nic z terminala ani pliku dziennika. skrypt Pythona działa dobrze. co tu się dzieje? brakuje mi czegoś

niektóre rady byłyby mile widziane. z góry dziękuję.

daehee
źródło
3
Buforowanie zachowuje się inaczej w przypadku rur i zacisków. Może być konieczne wykonanie wyraźnego polecenia sys.stdout.flush()ze swojego skryptu za każdym razem, gdy logujesz linię.
Lukas Graf,
Aby poznać inne sposoby wyzwalania niebuforowanych danych wyjściowych, zobacz stackoverflow.com/q/107705/1328439
Dmitri Chubarov

Odpowiedzi:

179

Od 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.

Możesz więc:

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

Lub używając tee:

python -u client.py | tee logfile
Vor
źródło
1
Alternatywą byłoby użycie script, które również wyłącza buforowanie i dodatkowo powoduje działanie sekwencji sterujących ( C-a, klawiszy kursora itp.): Stackoverflow.com/a/39269661/15690 .
niebieskawy
doskonały! działał również w Pythonie 3 na moim Raspberry Pi 3 wyposażonym w Raspbian Jessie: python3 -u client.py | tee logfile
Antonino
Uwaga: python, podobnie jak różne inne polecenia, będzie używał buforowania liniowego, jeśli stdin i stdout są konsolami, ale w pełni buforowany, jeśli wyniki są przekierowywane do pliku lub potoku. teejest postrzegany jako potok (którym jest), a nie hybryda: pisze do konsoli. Uwaga: zachowanie można również kontrolować w programie w języku Python.
Giacomo Catenazzi
Kolejna uwaga: python -u client.py | tee >> logfilenie zadziała. >>Wprowadzi kolejny przypadek buforowanej piśmie do pliku. To właśnie tee -arozwiązuje.
tanius