2011-09-18 19 views
9

Kısa bir süre önce işletim sistemini değiştirdim ve daha yeni bir Python kullanıyorum (2.7). Eski sistemimde, anında basabiliyordum. Örneğin, ben döngü için bir hesaplama yoğun vardı varsayalım: python yazdırma işlevi gerçek zamanlı olarak

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

sonra her yineleme tamamlanan kodu olarak, benim şimdiki sistemde, Ancak i

yazdıracak, piton böylece stdout'u önbelleğe görünüyor Terminal birkaç dakika için boştur, bundan sonra basılır:

 
1 
2 
3 

Kısa bir süre sonra. Daha sonra, birkaç dakika sonra, aşağıdakileri yazdırır:

 
4 
5 
6 

vb. Python'u print bildirgesine ulaştığı anda nasıl yazdırabilirim?

+0

Evet ... bu Python değil. –

cevap

8

deneyin baskı

import sys 

... 
sys.stdout.flush() 

sonra stdout floş çağrı Ya da command line seçenek -u kullanmak:

Kuvvet stdin, stdout ve stderr tamamen tamponsuz olmak.

+0

Teşekkürler! Bu işe yarıyor ama bunu nasıl otomatik olarak ayarlayabileceğimi biliyor musun? – Rishi

+2

@Rishi: Otomatik olarak (en yakın python sürümünü derlemek zorunda kalmadan) sahip olabileceğiniz en yakın nokta, "PYTHONUNBUFFERED" ortam değişkenini ayarlamak olacaktır. –

+0

Jeff'in yorumu benim için çok yararlı oldu. Teşekkürler – Rishi

1

İthalat yeni print-as-function Python 3.x olarak: Bu veriyor

from __future__ import print_function 

(senaryonuz/modülün üstündeki deyimi koymak) Yeni yerine kendi ile yazdırma fonksiyonu:

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

Avantajınız bu şekilde komut dosyanızdır Bir gün Python 3.x'e yükselttiğinizde aynı şekilde çalışır.

Ps1: Denemedim, ancak yazdırma işlevini varsayılan olarak temizleyebilirsiniz.

PS2: Ayrıca ilginizi çekebilir progressbar example.

+0

Üzgünüm @Rishi, muhtemelen bir önceki sürümü gördükten sonra cevabımın bir tekrar yazdığını doğruladı .. – Remi

6

Python 3.3'ten beri yazdırma işlevine flush=True'u geçebilirsiniz.