Sử dụng phương thức sys.stdout.flush ()


Câu trả lời:


173

Tiêu chuẩn của Python được đệm (có 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 vào thiết bị đầu cuối). Việc 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 thực hiện.

Dưới đây là một số thông tin tốt về (un) bộ đệm I / O và lý do tại sao nó hữu ích:
http://en.wikipedia.org/wiki/Data_buffer Được đệm so với IO không có bộ đệm


@Ciastopiekarz Chúng ta có thể làm gì để bộ đệm được xóa trên windows?
bất

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

119

Hãy xem xét tập lệnh Python đơn giản sau:

import time
import sys

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

Điều 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 bộ đệ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 thành, và sau đó tất cả bạn sẽ thấy 0 1 2 3 4được in đến màn hình.

Điều này là do đầu ra đang được đệm và trừ khi bạn xả sys.stdoutsau mỗi lần printbạn sẽ không thấy đầu ra ngay lập tức. Xóa bình luận từ sys.stdout.flush()dòng để thấy sự khác biệt.


48
Trong Python 3.x, 'print i' nên được thay thế bằng print (i, end = '') vì print () trong Python 3 có tiền tố mặc định end = '\ n' sẽ nhắc giao diện điều khiển lật.
ofer.sheffer

5
Tôi chỉ bối rối, khi tôi xóa dấu phẩy thì nó hoạt động tốt như mong đợi. Có logic đệm nào cho các dòng mới không ??
Sunil Lulla

7

Theo hiểu biết của tôi, bao giờ chúng ta thực hiện đầu ra câu lệnh in 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ẽ bị xóa khi chương trình thoát. NHƯNG CHÚNG TÔI C CANNG CÓ THỂ CẨN THẬN BUFFER MANUALLY bằng cách sử dụng câu lệnh "sys.stdout.flush ()" trong chương trình. Trong bộ đệm mã dưới đây sẽ bị xóa khi giá trị của i đạt 5.

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

chiru@online:~$ cat 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@online:~$ 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

Thiếu dấu phẩy sau khi print inhận được kết quả đầu ra của bạn
BơiBikeRun

1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()

1

Theo sự hiểu biết của tôi, sys.stdout.flush () đẩy tất cả dữ liệu đã được đệm vào điểm đó đến một đối tượng tệp. Trong khi sử dụng thiết bị xuất chuẩn, dữ liệu được lưu trữ trong bộ nhớ đệm (trong một thời gian hoặc cho đến khi bộ nhớ được lấp đầy) trước khi ghi vào thiết bị đầu cuối. Sử dụng lực lượng flush () để làm trống bộ đệm và ghi vào thiết bị đầu cuối ngay cả trước khi bộ đệm có không gian trống.

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.