जवाबों:
पायथन का मानक बाहर बफर्ड है (इसका अर्थ है कि यह कुछ डेटा "लिखे" को मानक आउट करने से पहले इकट्ठा करता है क्योंकि यह टर्मिनल पर लिखता है)। कॉलिंग sys.stdout.flush()
इसे बफर को "फ्लश" करने के लिए मजबूर करता है, जिसका अर्थ है कि यह टर्मिनल को बफर में सब कुछ लिख देगा, भले ही आम तौर पर ऐसा करने से पहले इंतजार करें।
यहाँ (संयुक्त राष्ट्र) के बारे में कुछ अच्छी जानकारी दी गई है कि मैं / O बफ़र कर रहा हूँ और यह क्यों उपयोगी है:
http://en.wikipedia.org/wiki/Data_buffer बफ़र
बनाम असंबद्ध IO
sys.stdout.write("%d" % i)
हूं, तो मुझे sys.stdout.flush()
बफर को प्रदर्शित करने के लिए कॉल को अनकंफर्ट करना होगा क्योंकि स्क्रिप्ट निष्पादित हो रही है।
निम्नलिखित सरल पायथन लिपि पर विचार करें:
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
यह पाँच सेकंड के लिए हर सेकंड में एक नंबर को प्रिंट करने के लिए डिज़ाइन किया गया है, लेकिन अगर आप इसे चलाते हैं तो यह अब (आपके डिफ़ॉल्ट सिस्टम बफ़रिंग के आधार पर) हो सकता है कि स्क्रिप्ट पूरी होने तक आपको कोई आउटपुट दिखाई न दे, और फिर एक बार आपको 0 1 2 3 4
प्रिंट दिखाई देगा। स्क्रीन पर।
इसका कारण यह है कि आउटपुट बफ़र किया जा रहा है, और जब तक आप sys.stdout
प्रत्येक के बाद फ्लश नहीं करते हैं तब तक आप print
आउटपुट तुरंत नहीं देखेंगे। sys.stdout.flush()
अंतर देखने के लिए लाइन से टिप्पणी निकालें ।
मेरी समझ के अनुसार, जब भी हम प्रिंट स्टेटमेंट निष्पादित करते हैं, तो बफर को लिखा जाएगा। और हम स्क्रीन पर आउटपुट देखेंगे जब बफर फ्लश हो जाता है (साफ़ हो जाता है)। प्रोग्राम से बाहर निकलने पर डिफ़ॉल्ट बफर को फ्लश किया जाएगा। लेकिन हम कार्यक्रम में "sys.stdout.flush ()" स्टेटमेंट का उपयोग करके खरीदार को भी सूचित कर सकते हैं। नीचे दिए गए कोड में बफर फ्लश हो जाएगा जब i का मान 5 तक पहुंच जाएगा।
आप नीचे दिए गए कोड को निष्पादित करके समझ सकते हैं।
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
print i
अपना आउटपुट प्राप्त करने के बाद अल्पविराम गुम होना
मेरी समझ के अनुसार sys.stdout.flush () उन सभी डेटा को धकेलता है जो फ़ाइल ऑब्जेक्ट पर उस बिंदु पर बफ़र किए गए हैं। स्टैडआउट का उपयोग करते समय, डेटा बफर मेमोरी में संग्रहीत किया जाता है (कुछ समय के लिए या जब तक मेमोरी भर नहीं जाती) टर्मिनल से लिखे जाने से पहले। बफर खाली करने के लिए फ्लश () बलों का उपयोग करना और बफर खाली जगह होने से पहले ही टर्मिनल को लिखना।