2011-11-10 13 views
14

मुझे subprocess.Popen या subprocess.call का उपयोग करने में कोई समस्या है जब मैं उन्हें कमांड लाइन निष्पादित करने के लिए उपयोग करता हूं जो बहुत सारे आउटपुट उत्पन्न करता है, पाइथन स्क्रिप्ट लटकती है, लेकिन क्या है अजीब बात है कि थोड़ी देर इंतजार करने के बाद, जबकि स्क्रिप्ट अपने लटकते राज्य में है, मुझे लगता है कि सीएमडी लाइन द्वारा आदेश दिया गया काम किया गया है, और केवल स्क्रिप्ट लटका दी गई है।पायथन: subprocess.Popen और subprocess.call hang

subprocess.call(cmd, shell = True) 
#OR 
subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True) 
# HANGS HERE 
print "show something after subprocess" 

ध्यान दें कि अंतिम प्रिंट कभी निष्पादित नहीं होता है, लेकिन वास्तव में cmd ​​निष्पादित किया गया है।

नोट भी cmd धारावाहिक बंदरगाह से संबंधित है, इसलिए जब मैं धारावाहिक केबल प्लग करता हूं, तो सबकुछ ठीक हो जाता है, और अंतिम प्रिंट स्टेटमेंट निष्पादित हो जाता है। लेकिन जब मैं टर्मिनल का उपयोग करता हूं तो सब कुछ ठीक है, भले ही धारावाहिक प्लग इन हो, यह केवल पायथन लिपि के साथ होता है।

धन्यवाद एक बहुत

उत्तर

12
अजगर प्रलेखन के अनुसार

, subprocess.call आदेश चलाता है और इसके पूर्ण होने की प्रतीक्षा करता है, तो यह subprocess.PopenPopen.wait के बाद के बराबर है।

हालांकि, Popen.wait विधि प्रलेखन बफर ओवरफ़्लो की समस्या के बारे में स्पष्ट रूप से चेतावनी देता है और इसके बजाय Popen.communicate का उपयोग करने की अनुशंसा करता है। क्यों अपनी पहली पंक्ति से काम नहीं करता

import subprocess 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) 
stdout, stderr = process.communicate() 
print "show something after subprocess" 
+1

यदि आप 'subprocess.PIPE' का उपयोग नहीं करते हैं, तो ओपी नहीं है, तो 'subprocess.call' का उपयोग करने में कोई समस्या नहीं है। – interjay

+1

यह स्पष्ट नहीं करता है कि 'प्रिंट' कथन का आउटपुट माता-पिता में क्यों नहीं दिखाया जाता है। 'पॉपन()' बच्चे के लिए इंतजार नहीं करता है भले ही बच्चे की प्रक्रिया पूरी बफर के साथ पाइप को लिखने के प्रयास में अवरुद्ध हो। – jfs

2

मुझे समझ नहीं आता - के रूप में वहाँ कोई stdin/stdout/stderr पुनर्निर्देशन कर रहे हैं, कोई जरूरत नहीं है: इसलिए, समाधान आप देख रहे हैं की तरह कुछ किया जाना चाहिए अवरुद्ध करने के लिए।

दूसरा एक अगर प्रक्रिया

  1. stdin के माध्यम से डेटा की उम्मीद है या
  2. stdout करने के लिए की तुलना में एक पाइप wothout धारण कर सकते हैं पढ़ा जा रहा अधिक डेटा भेजता ब्लॉक करने के लिए माना जाता है।

लेकिन जैसा कि आपका उपप्रोसेस सही ढंग से समाप्त हो जाता है, मुझे भी अवरुद्ध करने का कोई कारण नहीं दिख रहा है। क्या आप वाकई वाकई समाप्त हो जाते हैं?

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