2009-10-16 27 views
5

Tôi có một công việc crontab gọi một kịch bản python và xuất vào một tập tin:Tại sao sản lượng bash đôi khi không tuôn ra của một chương trình python vào một tập tin

python run.py &> current_date.log 

bây giờ đôi khi khi tôi làm

tail -f current_date.log 

Tôi thấy tệp đầy với đầu ra, nhưng lần khác tệp nhật ký tồn tại, nhưng vẫn trống trong một thời gian dài. Tôi chắc chắn rằng tập lệnh python đang in nội dung ngay sau khi nó bắt đầu chạy và tệp nhật ký được tạo. Bất kỳ ý tưởng tại sao nó vẫn trống một thời gian?

+2

Câu hỏi trùng lặp: http://stackoverflow.com/questions/107705/python-output-buffering – Steven

Trả lời

12

Đầu ra bộ đệm Python khi phát hiện ra nó không ghi vào một tty, và vì vậy tệp nhật ký của bạn có thể không nhận được bất kỳ đầu ra nào ngay lập tức. Bạn có thể cấu hình kịch bản của bạn để đầu ra tuôn ra hoặc bạn có thể gọi python với đối số -u để có được đầu ra không bị chặn.

$ python -h 

... 

-u  : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x) 
     see man page for details on internal buffering relating to '-u' 

... 
8

Vấn đề thực sự là Python (không phải bash) và theo thiết kế. Mặc định là bộ đệm Python. Chạy python với -u để tránh đệm.

Một đề xuất khác là tạo lớp (hoặc chức năng đặc biệt) gọi flush() ngay sau khi ghi vào tệp nhật ký.

Các vấn đề liên quan