linux tee ไม่ทำงานกับ python?


103

ฉันสร้างสคริปต์ python ซึ่งสื่อสารกับเว็บเซิร์ฟเวอร์โดยใช้ลูปที่ไม่มีที่สิ้นสุด ฉันต้องการบันทึกข้อมูลการสื่อสารทั้งหมดลงในไฟล์และตรวจสอบจากเทอร์มินัลในเวลาเดียวกัน ดังนั้นฉันจึงใช้คำสั่งทีเช่นนี้

python client.py | tee logfile

อย่างไรก็ตามฉันไม่ได้รับอะไรเลยจากเทอร์มินัลหรือไฟล์บันทึก สคริปต์ python ทำงานได้ดี เกิดอะไรขึ้นที่นี่? ฉันพลาดอะไรไปรึเปล่า?

คำแนะนำบางอย่างจะได้รับการชื่นชม ขอบคุณล่วงหน้า.


3
การบัฟเฟอร์ทำงานแตกต่างกันไปสำหรับท่อและขั้วต่อ คุณอาจต้องดำเนินการอย่างชัดเจนsys.stdout.flush()จากสคริปต์ของคุณทุกครั้งที่คุณเข้าสู่ระบบ
Lukas Graf

สำหรับวิธีอื่น ๆ ในการทริกเกอร์เอาต์พุตที่ไม่มี
บัฟเฟอร์

คำตอบ:


181

จาก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

ยอดเยี่ยม! มันทำงานได้เช่นกันใน Python 3 บน Raspberry Pi 3 ของฉันที่ติดตั้ง Raspbian Jessie: python3 -u client.py | tee logfile
Antonino

หมายเหตุ: python เช่นเดียวกับคำสั่งอื่น ๆ จะใช้ line buffered หาก stdin และ stdout เป็นคอนโซล แต่จะบัฟเฟอร์เต็มหากผลลัพธ์ถูกเปลี่ยนเส้นทางไปยังไฟล์หรือไพพ์ teeจะเห็นเหมือนท่อ (ซึ่งเป็น) ไม่ใช่ไฮบริด: เขียนลงคอนโซล หมายเหตุ: พฤติกรรมนี้สามารถควบคุมได้ภายในโปรแกรม python
Giacomo Catenazzi

หมายเหตุอื่น: python -u client.py | tee >> logfileจะไม่ทำงาน >>จะแนะนำกรณีของการเขียนบัฟเฟอร์อื่นไปยังแฟ้ม นั่นคือสิ่งที่tee -aแก้ได้
tanius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.