2014-10-13 6 views
7
import time 

print 1 
time.sleep(5) 

मैंने ऊपर दिए गए कोड को आईपीथॉन नोटबुक और सामान्य लिपि में अलग से चलाया।आईपीथॉन नोटबुक पूरा प्रोग्राम समाप्त होने तक प्रिंट नहीं कर रहा है

IPython Notebook में, यह संख्या तक time.sleep(5) समाप्त हो गया है, मुद्रित नहीं करता है '1' जबकि सामान्य लिपि में यह संख्या प्रिंट आउट करता है '1' पहली और time.sleep(5) में जाने। ऐसा क्या होगा?

यह उदाहरण सिर्फ मेरी समस्या का वर्णन करने के लिए है: मैं अपने कोड में प्रत्येक चरण में कुछ पाठ मुद्रित करने के लिए print का उपयोग करता हूं, जो खत्म होने में लंबा समय लगता है, ताकि मैं जान सकूं कि प्रोग्राम कहां मिल गया है। मैंने पाया कि यह स्क्रिप्ट निष्पादित करते समय ठीक काम करता है, लेकिन IPython Notebookprint अक्सर पीछे रहता है और पूरा प्रोग्राम समाप्त होने पर सब कुछ मुद्रित होता है।

IPython Notebook में इसे हल करने का कोई तरीका है?

+0

में दूसरा कारण देखें नोटबुक खत्म करने के लिए कोड के लिए इंतज़ार करना होगा इससे पहले कि आप उत्पादन –

+1

@PadraicCunningham देखें: आप स्क्रिप्ट समाप्त करने के लिए इससे पहले कि आप उत्पादन देख सकते हैं के लिए प्रतीक्षा करने की जरूरत नहीं है। देखें [मेरा जवाब] (http://stackoverflow.com/a/26352157/4279) – jfs

उत्तर

12

यह एक बफरिंग मुद्दा है। प्रिंट के तुरंत बाद आउटपुट देखने के लिए sys.stdout.flush() जोड़ें। आप python -u कमांड का भी उपयोग कर सकते हैं या PYTHONUNBUFFERED envvar सेट कर सकते हैं। Disable output buffering देखें।

पाइथन लाइन-बफरिंग का उपयोग करता है यदि यह इंटरैक्टिव (टर्मिनल में) चलाता है और आउटपुट रीडायरेक्ट होने पर ब्लॉक बफरिंग (उदा।, ~ 4 के बाइट बफर) ब्लॉक करता है। की तुलना करें:

$ python your_script.py 

और

$ python your_script.py | cat 

उत्पादन दूसरे मामले में देरी हो रही है।

Q: Why not just use a pipe (popen())?

+0

मुझे पायथन स्क्रिप्ट gitlab परिनियोजन कार्य से आउटपुट प्रदर्शित करने और प्रत्येक प्रिंट कमांड के बाद 'sys.stdout.flush()' जोड़ने में समस्या आ रही थी मेरी समस्या हल स्क्रिप्ट निष्पादित होने के बाद अब आउटपुट प्रिंट करता है। –

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