2011-09-04 12 views
5

में फ़्लश किया गया है, मैं कुछ कोड लिखने की कोशिश कर रहा हूं, जिसमें बहुत सी समान प्रक्रियाएं शामिल हैं। और sys.stdout पर उत्पादन से जुड़े कुछ अवांछित व्यवहार और कुछ संदेश दो बार मुद्रित किए जा रहे हैं। डिबगिंग उद्देश्यों के लिए यह जानना बहुत उपयोगी होगा कि किसी निश्चित बिंदु पर sys.stdout फ़्लश किया गया है या नहीं। मुझे आश्चर्य है कि यह संभव है और यदि हां, तो कैसे?कैसे बताएं कि sys.stdout को पायथन

Ps। मुझे नहीं पता कि यह मायने रखता है लेकिन मैं ओएस एक्स का उपयोग कर रहा हूं (कम से कम कुछ sys कमांड ऑपरेटिंग सिस्टम पर निर्भर करते हैं)।

+6

फ्लश या नहीं, sys.stdout आपको प्रक्रियाओं के बीच गारंटीकृत आदेश देने वाला नहीं है (और यह एक ही प्रक्रिया में धागे के बीच भी नहीं हो सकता है)। सटीक टाइमस्टैम्प और प्रत्येक से अलग संदेश लॉग इन क्यों न करें, या इससे भी बेहतर, क्या उनमें से सभी थ्रेडसेफ या इंटरप्रोसेस कतार के माध्यम से डीबग संदेश भेजते हैं? – James

+0

समस्या यह है कि एक ही आउटपुट दो बार होता है, इसलिए टाइमस्टैम्प e.t.c. जोड़ना। वास्तव में मदद नहीं करेगा। कुछ कस्टम के लिए sys.stdout को भी बदलना मदद नहीं करता है क्योंकि यह वास्तव में बफर के साथ एक समस्या है। अगर मैं -उ फ्लैग के साथ सभी शामिल पायथन प्रक्रियाओं को शुरू करता हूं तो मुझे समस्या नहीं मिलती है। मैं जानना चाहता हूं कि कुछ आईओ खुशियों के बाद हमेशा झुकाव के बजाय वास्तव में क्या चल रहा है, क्योंकि यह इस मुद्दे के मूल को समझे बिना एक बदसूरत कामकाज होगा। – koffie

उत्तर

1

उत्तर है: आप नहीं बता सकते हैं (बिना गंभीर बदसूरत, बाहरी सी मॉड्यूल या इसी तरह के)।

कारण यह है कि पायथन की फ़ाइल-कार्यान्वयन FILE * के लिए सी (stdio) कार्यान्वयन पर आधारित है। इसलिए अंतर्निहित पायथन फ़ाइल ऑब्जेक्ट मूल रूप से केवल FILE खोला गया है। डेटा लिखते समय सी-कार्यान्वयन डेटा लिखता है, और जब आप इसे flush() पायथन पर बताते हैं तो फ्लश कॉल को भी आगे बढ़ाते हैं। तो अजगर जानकारी पकड़ नहीं है। अंतर्निहित सी परत के लिए भी, एक त्वरित खोज ने लौटाया कि कोई भी दस्तावेज एपीआई आपको इस जानकारी तक पहुंचने की इजाजत नहीं दे रहा है, हालांकि यह शायद FILE ऑब्जेक्ट में कहीं भी है, इसलिए सिद्धांत में इसे पढ़ा जा सकता है यदि यह बेहद जरूरी है।

+0

धन्यवाद, बुरा है कि अगर संभव हो तो यह बहुत परेशानी है। चूंकि मैं केवल डीबग प्रूप्स के लिए यह जानना चाहता था, इसलिए मैंने sys.stdout.flush() कथनों का विज्ञापन करने का निर्णय लिया और देखा कि मेरे कार्यक्रम का व्यवहार बदल गया है या नहीं। अगर यह बदल गया तो मैंने माना कि यह उस बिंदु पर नहीं फंस गया था। – koffie

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