tee linux không hoạt động với python?


102

Tôi đã tạo một tập lệnh python giao tiếp với máy chủ web bằng vòng lặp vô hạn. Tôi muốn ghi mọi dữ liệu giao tiếp vào một tệp và đồng thời giám sát chúng từ thiết bị đầu cuối. vì vậy tôi đã sử dụng lệnh tee như thế này.

python client.py | tee logfile

tuy nhiên, tôi không nhận được gì từ terminal cũng như logfile. tập lệnh python đang hoạt động tốt. chuyện gì đang xảy ra ở đây? tui bỏ lỡ điều gì vậy?

một số lời khuyên sẽ được đánh giá cao. cảm ơn bạn trước.


3
Bộ đệm hoạt động khác nhau đối với đường ống và thiết bị đầu cuối. Bạn có thể cần thực hiện một cách rõ ràng sys.stdout.flush()từ tập lệnh của mình bất cứ khi nào bạn ghi lại một dòng.
Lukas Graf

Đối với những cách khác để kích hoạt không có bộ đệm đầu ra see stackoverflow.com/q/107705/1328439
Dmitri Chubarov

Câu trả lời:


178

Từ 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.

Vì vậy, những gì bạn có thể làm là:

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

Hoặc sử dụng tee:

python -u client.py | tee logfile

1
Một giải pháp thay thế sẽ được sử dụng script, cũng vô hiệu hóa bộ đệm và bổ sung làm cho chuỗi điều khiển ( C-a, phím con trỏ, v.v.) hoạt động: stackoverflow.com/a/39269661/15690 .
blueyed

thông minh! nó cũng hoạt động bằng Python 3 trên Raspberry Pi 3 của tôi được trang bị Raspbian Jessie: python3 -u client.py | tee logfile
Antonino

Lưu ý: python, giống như các lệnh khác sẽ sử dụng dòng được đệm nếu stdin và stdout là bảng điều khiển, nhưng được đệm đầy đủ nếu kết quả được chuyển hướng đến tệp hoặc đường ống. teeđược xem giống như một đường ống (chính là nó) chứ không phải dạng lai: nó ghi vào bảng điều khiển. Lưu ý: hành vi cũng có thể được kiểm soát bên trong một chương trình python.
Giacomo Catenazzi

Một lưu ý khác: python -u client.py | tee >> logfilesẽ không hoạt động. Điều >>này sẽ giới thiệu một trường hợp khác của việc ghi vào bộ đệm vào một tệp. Đó là những gì tee -agiải quyết.
tanius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.