2011-09-18 40 views
9

Gần đây, tôi đã chuyển hệ điều hành và đang sử dụng một Python mới hơn (2.7). Trên hệ thống cũ của tôi, tôi đã từng có thể in ngay lập tức. Ví dụ, giả sử tôi có một tính toán cường độ cao cho vòng lặp:Chức năng in python trong thời gian thực

for i in range(10): 
    huge calculation 
    print i 

sau đó là mã hoàn thành mỗi lần lặp, nó sẽ in i

Tuy nhiên, trên hệ thống hiện tại của tôi, trăn dường như bộ nhớ cache stdout để thiết bị đầu cuối trống trong vài phút, sau đó thiết bị sẽ in:

 
1 
2 
3 

liên tiếp. Sau đó, sau vài phút nữa, bản in sẽ in:

 
4 
5 
6 

v.v. Làm thế nào tôi có thể làm cho in python ngay sau khi nó đạt đến tuyên bố print?

+0

Vâng ... đó không phải là Python. –

Trả lời

8

Cố gắng gọi flush của stdout sau khi in

import sys 

... 
sys.stdout.flush() 

Hoặc sử dụng một -u command line tùy chọn đó:

Force stdin, stdout và stderr là hoàn toàn không có bộ đệm.

+0

Cảm ơn! Điều này làm việc, nhưng bạn có biết làm thế nào tôi có thể thiết lập này tự động? – Rishi

+2

@Rishi: Gần nhất bạn có thể làm cho nó tự động (không cần phải biên dịch phiên bản python của riêng bạn) sẽ đặt biến môi trường 'PYTHONUNBUFFERED'. –

+0

Nhận xét của Jeff rất hữu ích đối với tôi. Cảm ơn bạn – Rishi

1

nhập mới print-as-function như trong Python 3.x:

from __future__ import print_function 

(đặt câu lệnh ở trên cùng của kịch bản của bạn/mô-đun)

này cho phép bạn thay thế mới chức năng in của riêng bạn:

def print(s, end='\n', file=sys.stdout): 
    file.write(s + end) 
    file.flush() 

Lợi thế là theo cách này, tập lệnh của bạn sẽ hoạt động tương tự khi bạn nâng cấp một ngày lên Python 3.x.

Ps1: Tôi đã không dùng thử, nhưng chức năng in bằng chức năng có thể chỉ xóa theo mặc định.

PS2: bạn cũng có thể quan tâm đến số progressbar example của mình.

+0

Xin lỗi @Rishi, tôi đã xác nhận việc viết lại câu trả lời của tôi có thể chỉ sau khi bạn xem phiên bản trước .. – Remi

6

Kể từ Python 3.3, bạn có thể chỉ cần chuyển flush=True tới chức năng in.

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