linux tee tidak bekerja dengan python?

103

Saya membuat skrip python yang berkomunikasi dengan server web menggunakan loop tak terbatas. Saya ingin mencatat setiap data komunikasi ke sebuah file dan juga memantaunya dari terminal pada waktu yang sama. jadi saya menggunakan perintah tee seperti ini.

python client.py | tee logfile

Namun, saya tidak mendapat apa-apa dari terminal atau file log. skrip python berfungsi dengan baik. apa yang terjadi disini? apakah saya melewatkan sesuatu?

beberapa nasihat akan sangat dihargai. Terima kasih sebelumnya.

daehee
sumber
3
Buffering berperilaku berbeda untuk pipa dan terminal. Anda mungkin perlu melakukan eksplisit sys.stdout.flush()dari skrip Anda setiap kali Anda membuat log baris.
Lukas Graf
Untuk cara lain untuk memicu keluaran unbuffered lihat stackoverflow.com/q/107705/1328439
Dmitri Chubarov

Jawaban:

179

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

Jadi yang bisa Anda lakukan adalah:

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

Atau menggunakan tee:

python -u client.py | tee logfile
Vor
sumber
1
Alternatif lain adalah menggunakan script, yang juga menonaktifkan buffering dan sebagai tambahan membuat urutan kontrol ( C-a, tombol kursor, dll.) Berfungsi: stackoverflow.com/a/39269661/15690 .
biru pada
luar biasa! itu bekerja juga dengan Python 3 di Raspberry Pi 3 saya yang dilengkapi dengan Raspbian Jessie: python3 -u client.py | tee logfile
Antonino
Catatan: python, seperti berbagai perintah lain akan menggunakan baris yang di-buffer jika stdin dan stdout adalah konsol, tetapi buffer penuh jika hasilnya dialihkan ke file atau pipa. teeterlihat seperti pipa (yang memang ada) dan bukan hybrid: itu menulis ke konsol. Catatan: perilaku juga dapat dikontrol di dalam program python.
Giacomo Catenazzi
Catatan lain: python -u client.py | tee >> logfiletidak akan berhasil. Itu >>akan memperkenalkan kasus lain penulisan buffer ke file. Itulah yang tee -amemecahkannya.
tanius