का उपयोग करते समय buffered किया गया है मेरे पास एक लंबा रन सर्वर प्रोग्राम (कहें, प्रोग्राम ए) है जो QT/C++ में लिखा गया है। कार्यक्रम इतना स्थिर नहीं है इसलिए मैं क्रैश होने पर इसे पुनरारंभ करने के लिए एक पायथन स्क्रिप्ट लिखने का निर्णय लेता हूं। समस्या यह है कि प्रोग्राम विफल हो सकता है (अगर मैंने इसे एक इन-यूज पोर्ट दिया है), त्रुटि प्रिंट करें और फिर छोड़ने के बिना बस लटकाएं, इसलिए मुझे प्रोग्राम के stdout पर नजर रखना चाहिए और विफल स्टार्टअप पर इसे मारना चाहिए।विंडोज कंसोल प्रोग्राम stdout पाइप रीडायरेक्शन
यह मेरा अंतिम कोड (अच्छी तरह से, वास्तव में यह ठीक है, तुम बस इसे अनदेखा कर सकते हैं) का एक टुकड़ा है:
self.subp = subprocess.Popen(
r'.\A.exe -server %d' % portnum,
stdout=subprocess.PIPE, bufsize=1)
for line in iter(self.subp.stdout.readline, ''):
print(line, end='')
लेकिन मैंने पाया मैं उपप्रक्रिया के stdout से कुछ भी नहीं पढ़ सकते हैं, ReadLine विधि बस वहां अवरुद्ध है, और यदि मैं ए प्रक्रिया को मारता हूं, तो पाइथन स्क्रिप्ट किसी भी आउटपुट के बिना बाहर निकलती है। शुरुआत में, मैंने सोचा कि यह सबप्रोसेस मॉड्यूल का मुद्दा है, लेकिन कुछ परीक्षणों के बाद मुझे पता चला कि यह नहीं है। अगर मैं कुछ अन्य विंडोज कंसोल प्रोग्राम के साथ एएक्सई कमांड लाइन को प्रतिस्थापित करता हूं, उदाहरण के लिए पिंग-टी, सब ठीक से काम करता है। तो मैंने सोचा कि यह एक कार्यक्रम की समस्या हो सकती है।
सौभाग्य से, मैं एक के स्रोत कोड है, यहां उत्पादन के साथ काम कर एक टुकड़ा है: कुछ खोज मैं कोड के इस टुकड़े के अंत तक fflush(stdout);
जोड़ने के बाद
printf("Server is starting on port %u\n", Config.ServerPort);
if(server->listen())
printf("Starting successfully\n");
else
printf("Starting failed!\n");
, कार्यक्रम के पुनर्निर्माण, और अब यह
इसलिए मेरी समस्या यह है कि मैं अभी भी समझ नहीं पा रहा हूं, मूल ए प्रोग्राम कोड में क्या गलत है? मजबूर फ्लश के बिना, कार्यक्रम शुरू होने के तुरंत बाद, यह विंडोज़ कंसोल में उन तारों को सही ढंग से प्रिंट कर सकता है। आउटपुट को आउटपुट पर पाइप का उपयोग करते समय क्यों buffered किया जाता है? मैंने पढ़ा है कि मानक सी कार्यान्वयन में, आउटपुट को नई लाइन पर स्वचालित रूप से फ़्लश किया जाएगा, लेकिन मेरी स्थिति में क्यों नहीं? क्या यह एक विंडोज़ मुद्दा है, या संकलक मुद्दा है?
ए प्रोग्राम क्यूटी/सी ++ के साथ संकलित किया गया है, क्यूटी संस्करण 4.7.4 (x32) है, सी ++ कंपाइलर ming32 g ++ QT (GCC 4.4.0) के साथ आता है, सभी परीक्षण Win7x64 प्लेटफॉर्म पर किए गए थे, और मेरा पायथन संस्करण 2.7.2
मुझे लगता है कि [संबंधित लिंक] (http://stackoverflow.com/q/20503671/4279) आपके लिंक में टिप्पणियों में बहुत कुछ बताता है, धन्यवाद – adamhj