Hướng dẫn dùng python stdout python

answer

139

Hướng dẫn dùng python stdout python

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

139 hữu ích 3 bình luận chia sẻ

answer

97

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.

97 hữu ích 2 bình luận chia sẻ

answer

5

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 @ trực tuyến: ~ $ 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 @ trực tuyến: ~ $

***** ĐẦU RA *****

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: ~ $

5 hữu ích 1 bình luận chia sẻ

answer

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.

1 hữu ích 0 bình luận chia sẻ

answer

0

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

0 hữu ích 0 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm