2011-05-06 3 views
12
import time 
import sys 
sys.stdout.write("1") 
time.sleep(5) 
print("2") 

5 सेकंडपायथन में, कुछ नई लाइन के बिना क्यों प्रिंट नहीं करेगा?

import time 
import sys 
sys.stdout.write("1\n") 
time.sleep(5) 
print("2") 

के बाद "12" प्रिंट "1 \ n" अभी, तो "2" 5 सेकंड

ऐसा क्यों है के बाद प्रिंट होगा होगा?

उत्तर

21

यदि आप "\ n" जोड़ते हैं तो स्ट्रीम स्वचालित रूप से फ्लश हो जाती है, और यह अंत में नई लाइन के बिना नहीं है। आप आउटपुट फ्लश कर सकते हैं:

sys.stdout.flush()

+0

मैंने आपके अलावा सभी उत्तरों को ऊपर छोड़ दिया क्योंकि यह कम व्याख्यात्मक है – eyquem

7

क्योंकि stdout buffered है। आप sys.stdout.flush() कॉल के साथ जल्द ही आउटपुट को मजबूर करने में सक्षम हो सकते हैं।

2

बफरिंग। यह वास्तव में पायथन नहीं है, बल्कि आपके ऑपरेटिंग सिस्टम/टर्मिनल है। किसी भी प्रोग्राम से आउटपुट बफर, स्मृति के एक होल्डिंग क्षेत्र पर भेजा जाता है। जब एक पूरी लाइन एकत्र की जाती है, तो इसे स्क्रीन पर भेजा जाता है। आमतौर पर एक हुक होता है, आंशिक रेखाओं के उत्पादन को मजबूर करने के लिए flush() जैसे कुछ विधि का नाम दिया जाता है।

1

पर विचार करें जब आप एक कंप्यूटर में एक आदेश लिखें, यह आप समाप्त कर लें तो पता नहीं है कि जब तक आप ENTER

इसी तरह, न्यू लाइन बताता अजगर आपको लगता है कि लाइन पूरा कर लें दबाएँ।

4

ऐसा इसलिए है क्योंकि पाइथन में आउटपुट डिफ़ॉल्ट रूप से buffered है - आम तौर पर जब तक बफर भरा नहीं जाता है तब तक आउटपुट नहीं मिलेगा या कुछ बफर को फ़्लश करने का कारण बनता है। इस मामले में \n महसूस किया गया था और एक स्वचालित फ्लश का कारण बन गया था।

समस्या को हल तरीके के लिए इस सवाल का देखें: How to flush output of Python print?

4

sys मॉड्यूल से sys.stdout.write आदेश उद्देश्यपूर्ण बाहर बयान \ N चरित्र के बिना प्रिंट करता है। इस प्रकार stdout स्ट्रीम कार्यों के लिए एक सामान्य कॉल, जैसे सी ++ या सी में, जहां \ n वर्ण मैन्युअल रूप से जोड़ा जाना चाहिए।

हालांकि पायथन द्वारा प्रदान किया गया प्रिंट कमांड स्वचालित रूप से स्ट्रिंग में \ n वर्ण जोड़ता है, इसलिए कोड को सरल बनाना और इसे पढ़ने में आसान बनाना।

कारण पहली बार घटना में घटना का कारण यह है कि सिस्टम मुद्रित करने के लिए फ्लश की प्रतीक्षा कर रहा है, जो \ n चरित्र द्वारा प्रदान किया जाता है। आप इस कमांड का उपयोग कर इस से बच सकते हैं, sys.stdout.flush(), जो स्टडआउट स्ट्रीम को फ्लश करेगा जो प्रिंट करने के लिए मजबूर करता है।

संबंधित मुद्दे