2012-01-27 20 views
5

का उपयोग करते समय 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

उत्तर

1

मैं आपके जैसा ही प्रश्न पूछता हूं। पाइप के (How fo force subprocess to refresh stdout buffer?)

stdout खिड़कियों पर अनुप्रेषित पूरी तरह से defaultly बफ़र है, इसका मतलब है, जब तक कि अंत या उपप्रक्रिया में printf के बाद fflush आह्वान करने के लिए उपप्रक्रिया रन आप पाइप से कुछ भी पढ़ा नहीं कर सकते।

यह विंडोज़ समस्या नहीं है, लेकिन डिज़ाइन द्वारा, और कभी-कभी किसी समस्या की तरह।

और मुझे इस प्रश्न के लिए एक अच्छा समाधान नहीं मिला है, मुझे बताएं कि क्या आप इसे हल करते हैं।

+0

मुझे लगता है कि [संबंधित लिंक] (http://stackoverflow.com/q/20503671/4279) आपके लिंक में टिप्पणियों में बहुत कुछ बताता है, धन्यवाद – adamhj

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