2012-04-04 30 views

Trả lời

107

Chuẩn của Python được đệm (nghĩa là nó thu thập một số dữ liệu "được ghi" thành tiêu chuẩn trước khi ghi dữ liệu vào đầu cuối). Gọi sys.stdout.flush() buộc nó phải "xả" bộ đệm, nghĩa là nó sẽ ghi mọi thứ trong bộ đệm vào thiết bị đầu cuối, ngay cả khi bình thường nó sẽ đợi trước khi làm như vậy.

Dưới đây là một số thông tin tốt về (un) đệm I/O và tại sao nó rất hữu ích:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

+2

tính năng này không hoạt động trên các cửa sổ! –

+0

@Ciastopiekarz Chúng ta có thể làm gì để bộ đệm được xả trên cửa sổ? – helplessKirk

+0

@Ciastopiekarz Bạn hình dung như thế nào? Nếu tôi lấy kịch bản Python của Andrew Clark và thay thế dòng in bằng 'sys.stdout.write ("% d "% i)', thì tôi phải bỏ ghi chú cuộc gọi đến 'sys.stdout.flush()' để lấy bộ đệm để hiển thị khi tập lệnh đang thực thi. –

71

Hãy xem xét kịch bản Python đơn giản sau đây:

import time 
import sys 

for i in range(5): 
    print i, 
    #sys.stdout.flush() 
    time.sleep(1) 

này được thiết kế để in một số mỗi giây trong năm giây, nhưng nếu bạn chạy nó như bây giờ (tùy thuộc vào đệm hệ thống mặc định của bạn), bạn có thể không thấy bất kỳ đầu ra nào cho đến khi tập lệnh hoàn tất, và sau đó tất cả cùng một lúc bạn sẽ thấy 0 1 2 3 4 được in trên màn hình.

Điều này là do đầu ra đang được lưu vào bộ đệm và trừ khi bạn tuôn ra sys.stdout sau mỗi print bạn sẽ không thấy kết quả ngay lập tức. Xóa nhận xét khỏi dòng sys.stdout.flush() để xem sự khác biệt.

+20

Trong Python 3.x, 'print i' nên được thay thế bằng bản in (i, end = '') bởi vì print() trong Python 3 có một tiền tố mặc định end = '\ n' để nhắc giao diện điều khiển bị xóa. –

+0

Tôi chỉ gặp sự cố này! Cảm ơn rất nhiều vì đã giải thích tại sao điều này giải quyết được! –

3

Theo hiểu biết của tôi, Khi bao giờ chúng tôi thực hiện in báo cáo đầu ra sẽ được ghi vào bộ đệm. Và chúng ta sẽ thấy đầu ra trên màn hình khi bộ đệm bị xóa (xóa). Theo mặc định bộ đệm sẽ được xóa khi thoát chương trình. NHƯNG CHÚNG TÔI C ALNG C FLNG B FLNG CÁCH CHẠY B byNG bằng cách sử dụng câu lệnh "sys.stdout.flush()" trong chương trình. Trong bộ đệm mã bên dưới sẽ bị xóa khi giá trị của i đạt đến 5.

Bạn có thể hiểu bằng cách thực thi mã bên dưới.

Chiru @ trực tuyến: ~ $ mèo flush.py

import time 
import sys 

for i in range(10): 
    print i 
    if i == 5: 
     print "Flushing buffer" 
     sys.stdout.flush() 
    time.sleep(1) 

for i in range(10): 
    print i, 
    if i == 5: 
     print "Flushing buffer" 
     sys.stdout.flush() 

Chiru @ trực tuyến: ~ $

***** ***** OUTPUT

Chiru @ trực tuyến: ~ $ python flush.py

0 1 2 3 4 5 Flushing buffer 
6 7 8 9 0 1 2 3 4 5 Flushing buffer 
6 7 8 9 

Chiru @ trực tuyến: ~ $

0
import sys 
for x in range(10000): 
    print "HAPPY >> %s <<\r" % str(x), 
    sys.stdout.flush() 
Các vấn đề liên quan