2013-01-21 51 views
6

मैं पायथन के subprocess.Popen का उपयोग कर, एक और स्क्रिप्ट का आउटपुट प्राप्त करने के लिए कोशिश कर रहा हूँ की तरहअजगर popen()। Stdout.read() लटका

process = Popen(command, stdout=PIPE, shell=True) 
exitcode = process.wait() 
output = process.stdout.read() # hangs here 

यह तीसरी लाइन पर लटका हुआ है, केवल जब मैं चलाने के इस प्रकार है यह एक अजगर लिपि के रूप में है और मैं इसे अजगर खोल में पुन: उत्पन्न नहीं कर सकता।

अन्य स्क्रिप्ट केवल कुछ शब्दों को प्रिंट करता है और मुझे लगता है कि यह एक बफर मुद्दा नहीं है।

क्या किसी को भी यह पता है कि मैं यहां क्या गलत कर रहा हूं?

+0

और यदि आप मैन्युअल रूप से 'कमांड' में कमांड चलाते हैं, तो यह आउटपुट उत्पन्न करता है? –

उत्तर

0

शायद आप .communicate().wait() प्लस .read() के बजाय .communicate() का उपयोग करना चाहते हैं। subprocess प्रलेखन पृष्ठ पर के बारे में wait() चेतावनी नोट:

चेतावनी इस गतिरोध होगा जब stdout=PIPE और/या stderr=PIPE का उपयोग कर और बच्चे की प्रक्रिया ऐसी है कि वह ब्लॉक ओएस पाइप बफर को स्वीकार करने के लिए इंतज़ार कर रहे एक पाइप के लिए पर्याप्त उत्पादन उत्पन्न करता है अधिक डेटा इससे बचने के लिए communicate() का उपयोग करें।

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

+0

उत्तर के लिए धन्यवाद। मुझे अभी एहसास हुआ कि मैंने दस्तावेज़ों के उस हिस्से को पढ़ा है .. मैं जो कर रहा था वह stdout रीयल-टाइम को 'प्रोसेस.poll() में नहीं ले रहा था, कोई नहीं है:' स्क्रिप्ट चल रहा है, जबकि लूप, और ऊपर दिया गया कोड था संस्करण नीचे छीन लिया। लेकिन मुझे लगता है कि यह एक समान डेडलॉक मुद्दे के कारण लटक रहा था ... – lyomi

0

पढ़ने() लौटने से पहले EOF के लिए इंतजार कर रहा है।

आप कर सकते हैं: उपप्रक्रिया के लिए

  • इंतजार मरने के लिए है, तो पढ़() वापस आ जाएगी।
  • रीडलाइन() का उपयोग करें यदि आपका आउटपुट लाइनों में टूटा हुआ है (यदि कोई आउटपुट लाइन नहीं है तो भी लटका होगा)।
  • os.read (एफ, एन) का उपयोग करें जो एफ से अधिकांश एन बाइट्स पर लौटाता है, लेकिन पाइप खाली होने पर भी ब्लॉक होगा (जब तक कि O_NONBLOCK fd पर सेट न हो)।

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

  • कोई संबंधित समस्या नहीं^_^