2012-04-04 12 views

उत्तर

107

पायथन का मानक आउट buffered है (जिसका अर्थ यह है कि यह टर्मिनल को लिखने से पहले मानक "मानक" के कुछ डेटा एकत्र करता है)। कॉलिंग sys.stdout.flush() इसे बफर को "फ्लश" करने के लिए मजबूर करता है, जिसका अर्थ यह है कि यह बफर में टर्मिनल में सब कुछ लिख देगा, भले ही सामान्यतः ऐसा करने से पहले प्रतीक्षा करें।

यहाँ के बारे में (अन) बफ़र आई/ओ कुछ अच्छी जानकारी है और क्यों उपयोग करें:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

+2

यह विंडोज़ पर काम नहीं करता है !!! –

+0

@Ciastopiekarz हम बफर को खिड़कियों पर फिसलने के लिए क्या कर सकते हैं? – helplessKirk

+0

@Ciastopiekarz आप कैसे समझते हैं? अगर मैं एंड्रयू क्लार्क की पायथन लिपि लेता हूं, और 'sys.stdout.write ("% d"% i)' के साथ प्रिंट लाइन को प्रतिस्थापित करता हूं, तो मुझे कॉल प्राप्त करने के लिए 'sys.stdout.flush()' पर कॉल को अपूर्ण करना होगा। स्क्रिप्ट निष्पादित होने के रूप में प्रदर्शित करने के लिए बफर। –

71

निम्नलिखित सरल अजगर स्क्रिप्ट पर विचार करें:

import time 
import sys 

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

यह एक संख्या पाँच सेकंड के लिए हर दूसरे मुद्रित करने के लिए डिज़ाइन किया गया है, लेकिन अगर आप इसे चलाने के रूप में यह अब है (आपके डिफ़ॉल्ट प्रणाली बफरिंग के आधार पर) आप कर सकते हैं स्क्रिप्ट पूर्ण होने तक कोई आउटपुट नहीं दिखता है, और फिर सभी एक बार आपको स्क्रीन पर मुद्रित 0 1 2 3 4 दिखाई देंगे।

ऐसा इसलिए है क्योंकि आउटपुट buffered किया जा रहा है, और जब तक आप प्रत्येक print के बाद sys.stdout फ्लश नहीं करते हैं तो आप तुरंत आउटपुट नहीं देख पाएंगे। अंतर देखने के लिए sys.stdout.flush() लाइन से टिप्पणी हटाएं।

+20

पायथन 3.x में, 'प्रिंट i' को प्रिंट के साथ प्रतिस्थापित किया जाना चाहिए (i, end = '') क्योंकि पायथन 3 में प्रिंट() में एक डिफ़ॉल्ट उपसर्ग अंत = '\ n' है जो कंसोल को फ्लश करने के लिए संकेत देता है। –

+0

मुझे बस यह समस्या थी! स्पष्टीकरण के लिए बहुत बहुत धन्यवाद यह क्यों हल करता है! –

3

मेरी समझ, कभी हम पर अमल प्रिंट बयान उत्पादन बफ़र होना लिखा जाएगा जब अनुसार। और बफर को फिसलने (साफ़) होने पर हम स्क्रीन पर आउटपुट देखेंगे। जब प्रोग्राम निकलता है तो डिफ़ॉल्ट बफर द्वारा फ़्लश किया जाएगा। लेकिन हम कार्यक्रम में "sys.stdout.flush()" कथन का उपयोग करके मैन्युअल रूप से बफर को भी फ्लश कर सकते हैं। नीचे दिए गए कोड बफर को तब तक फ़्लश किया जाएगा जब मैं पहुंचता हूं 5.

आप नीचे दिए गए कोड को निष्पादित करके समझ सकते हैं।

chiru @ ऑनलाइन: ~ $ बिल्ली 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 @ ऑनलाइन: ~ $

***** आउटपुट *****

chiru @ ऑनलाइन: ~ $ अजगर 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 @ ऑनलाइन: ~ $

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