2009-09-18 11 views
16

मेरे पास एक ऐसा प्रोग्राम है जो stdout और संभवतः stderr को लिखता है। मैं इसे पायथन से चलाने के लिए, stdout और stderr कब्जा करना चाहता हूँ।मैं कैसे पता लगा सकता हूं कि subprocess.Popen प्रतीक्षा करें() stdout = PIPE अगर हमेशा के लिए इंतजार कर रहा है?

from subprocess import * 

p = Popen(exe, shell=TRUE, stdout=PIPE, stderr=PIPE) 
rtrncode = p.wait() 

कार्यक्रमों की एक जोड़ी के लिए, यह ठीक काम करता है, लेकिन जब मैं एक नया एक जोड़ा, नया एक हमेशा के लिए लटका हुआ है: मेरा कोड की तरह दिखता है। अगर मैं stdout=PIPE हटा देता हूं, तो प्रोग्राम कंसोल और फिनिश पर अपना आउटपुट लिखता है और सब कुछ ठीक है। मैं कैसे तय कर सकता हूं कि लटकने का क्या कारण है?

विंडोज एक्सपी पर पायथन 2.5 का उपयोग करना। कार्यक्रम stdin से नहीं पढ़ता है और न ही इसमें किसी भी प्रकार का उपयोगकर्ता इनपुट है (यानी "एक कुंजी दबाएं")।

उत्तर

35

जब एक पाइप का बफर भर जाता है (आमतौर पर 4 केबी या तो), लेखन प्रक्रिया तब तक रुक जाती है जब तक एक रीडिंग प्रक्रिया ने कुछ डेटा को प्रश्न में पढ़ा नहीं है; लेकिन यहां तक ​​कि जब तक सबप्रोसेस नहीं किया जाता है, तब तक आप कुछ भी नहीं पढ़ रहे हैं, इसलिए डेडलॉक। The docswait पर यह बहुत स्पष्ट रूप से वास्तव में रख:

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

आप किसी कारण से communicate उपयोग नहीं कर सकते हैं, तो एक अस्थायी फ़ाइल के लिए उपप्रक्रिया लिखने, और फिर आप कर सकते हैं wait और इसके तैयार होते ही आपकी फाइल को पढ़ने - एक फ़ाइल के लिए लिख बजाय एक पाइप के, , डेडलॉक जोखिम नहीं है।

+0

आपने मुझे थोड़ा सा हराया। +1 – MitMaro

+0

पायथन 2.5 के साथ स्थापित सहायता फ़ाइल में जानकारी की उस छोटी सी जानकारी नहीं है। धन्यवाद –

+1

@ ग्रेमे, आह हाँ, 2.6 के दस्तावेज़ों में काफी सुधार हुआ है wrt 2.5's। –

1

docs पर एक नज़र डालें। यह बताता है कि आपको प्रतीक्षा का उपयोग नहीं करना चाहिए क्योंकि इससे मृत लॉक हो सकता है। communicate का उपयोग करने का प्रयास करें।

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

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