2013-12-13 6 views
6

मेरे पास एक पायथन प्रोग्राम है जिसमें मेरे पास कुछ प्रिंट स्टेटमेंट हैं, इसके बाद कुछ सी ++ निष्पादन योग्यों को कॉल किया जाता है, जिनसे मुझे स्टडआउट में कुछ आउटपुट भी मिलता है। जब मैं एक यूनिक्स टर्मिनल में इस पायथन स्क्रिप्ट को चलाता हूं तो मुझे अपेक्षित स्क्रीन पर आउटपुट मिलता है (सही क्रम में यानी पहले प्रिंट से सी ++ एक्जिक्यूटिव से)। समस्या यह है कि जब मैं इस आउटपुट को* निक्स पर्यावरण में नामित एक पायथन स्क्रिप्ट से stdout को रीडायरेक्ट करना सही ढंग से काम नहीं करता है

python test.py > out.txt 

पर फ़ाइल को रीडायरेक्ट करता हूं तो मुझे गलत क्रम में आउटपुट मिलता है। मुझे पहले C++ निष्पादन योग्य का आउटपुट मिलता है और फिर दूसरा।

+1

क्या आप वाकई सब कुछ STDOUT करने के लिए '' sys.stdout'' लिखा जा रहा है कर रहे हैं? –

+0

मुझे लगता है कि यह STDOUT पर जा रहा था ... मुझे अब समाधान मिला है ... मुझे sys.stdout.flush() के साथ stdout चाहिए ... – zeeshan

उत्तर

2

स्टीडआउट एक टीटी डिवाइस है जब पायथन लाइन-बफरिंग का उपयोग करता है, इसलिए आउटपुट प्रिंट स्टेटमेंट ऑर्डर के अनुसार होता है। पुनर्निर्देशन पाइथन बफर के मामले में प्रिंट स्टेटमेंट का उत्पादन होता है। जबकि सी ++ निष्पादन योग्य आउटपुट बफरिंग दोनों मामलों में पायथन द्वारा नियंत्रित नहीं किया जाता है। तो जब आउटपुट रीडायरेक्ट किया जाता है, तो प्रिंट स्टेटमेंट buffered हो रहे हैं और बफर भरने तक प्रोग्राम आउटपुट नहीं करते हैं या प्रोग्राम समाप्त होता है।

sys.stdout.flush() प्रिंट विवरणों के आउटपुट को नीचे के रूप में फ़्लश करेगा। नोट यह प्रिंट बयान

का पालन करना चाहिए
#!/usr/local/bin/python 
import os 
import sys 

print("Hello1") 
print("Hello2") 
sys.stdout.flush() 
os.system("/python/cppprog.o") 
print("Bye1") 
print("Bye2") 

आउटपुट:

]# python script.py > o.txt 
]# cat o.txt 
Hello1 
Hello2 
Hello, world! 
Bye1 
Bye2 
+0

sys.stdout.flush() काम करता है – zeeshan

0

ऐसा इसलिए है क्योंकि पायथन का स्टडआउट बफर और ओएस 'स्टडआउट बफर सिंक नहीं किया गया है।

अपने प्रिंट स्टेटमेंट के बाद और सी ++ निष्पादन योग्य निष्पादित करने से पहले stdout flushing आज़माएं।

import sys 
sys.stdout.flush() 
+0

हाँ मुझे लगता है कि यह काम करेगा। – zeeshan

+0

यह काम करता है ... धन्यवाद .. – zeeshan

5

आप unbuffered उत्पादन आदेश पंक्ति स्विच -u, उपयोग करने के साथ अजगर चला सकते हैं, यानी आप सिर्फ python -u myscript.py कॉल कर सकते हैं और stdout में उत्पादन उसके बाद सिंक्रनाइज़ किया जाना चाहिए।

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