Sys.stdout.flush () विधि का उपयोग


जवाबों:


173

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

यहाँ (संयुक्त राष्ट्र) के बारे में कुछ अच्छी जानकारी दी गई है कि मैं / O बफ़र कर रहा हूँ और यह क्यों उपयोगी है:
http://en.wikipedia.org/wiki/Data_buffer बफ़र
बनाम असंबद्ध IO


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

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

119

निम्नलिखित सरल पायथन लिपि पर विचार करें:

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()अंतर देखने के लिए लाइन से टिप्पणी निकालें ।


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

5
मैं सिर्फ भ्रमित हूं, जब मैं अल्पविराम हटाता हूं तो यह उम्मीद के मुताबिक ठीक काम कर रहा है। नई लाइनों के लिए कोई बफर तर्क है ??
सुनील लुल्ला

7

मेरी समझ के अनुसार, जब भी हम प्रिंट स्टेटमेंट निष्पादित करते हैं, तो बफर को लिखा जाएगा। और हम स्क्रीन पर आउटपुट देखेंगे जब बफर फ्लश हो जाता है (साफ़ हो जाता है)। प्रोग्राम से बाहर निकलने पर डिफ़ॉल्ट बफर को फ्लश किया जाएगा। लेकिन हम कार्यक्रम में "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अपना आउटपुट प्राप्त करने के बाद अल्पविराम गुम होना
SwimBikeRun

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

1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.