2010-06-26 11 views
5

मैं इस कोड है:अजगर उपप्रक्रिया छिपाने stdout और यह इंतजार पूरा करने के लिए

def method_a(self): 
    command_line = 'somtoolbox GrowingSOM ' + som_prop_path 
    subprocess.Popen(shlex.split(command_line)) 
    ...... 

def method_b(self): ..... 
.... 

और चाहते है कि तुम सब देखते हैं, method_a एक उपप्रक्रिया कि somtoolbox कार्यक्रम बुला रहा है है। लेकिन इस कार्यक्रम में एक लंबा स्टडआउट है, और मैं इसे छिपाना चाहता हूं। मैंने कोशिश की:

subprocess.Popen(shlex.split(command_line), stdout=subprocess.PIPE) 

लेकिन यह इस वाक्य लौटे:

cat: record error: Broked Pipe 

(इस पुर्तगाली वाक्य का अनुवाद है: "बिल्ली: erro de gravação: पाइप Quebrado") (मैं से हूँ ब्राजील)

इसके अलावा, मेरे पास अन्य विधियां हैं (जैसे method_b वहाँ), जिन्हें method_a के बाद बुलाया जाता है, और प्रक्रिया के पूर्ण होने से पहले टीआईएस विधियां चल रही हैं।

मैं स्टडआउट को कैसे छुपा सकता हूं (और इसे कहीं भी नहीं चाहता), और अन्य कोड निष्पादन को समाप्त करने के लिए उपप्रोसेस के लिए प्रतीक्षा करें?

ओब्स: सोमटोल्क्स एक जावा प्रोग्राम है, जो टर्मिनल को लंबा आउटपुट देता है। की कोशिश की:

outputTuple = subprocess.Popen(shlex.split(command_line), stdout = subprocess.PIPE).communicate() 

लेकिन निरंतर खोल करने के लिए उत्पादन लौटने। सहायता!

उत्तर

18

ऐसा करने का सबसे अच्छा तरीका आउटपुट को/dev/null में रीडायरेक्ट करना है। आप क्या कर सकते हैं कि इस तरह:

devnull = open('/dev/null', 'w') 
subprocess.Popen(shlex.split(command_line), stdout=devnull) 

तब तक प्रतीक्षा करने यह किया है, तो आप .Wait() popen वस्तु पर उपयोग कर सकते हैं, यह करने के लिए आप हो रही:

devnull = open('/dev/null', 'w') 
process = subprocess.Popen(shlex.split(command_line), stdout=devnull) 
retcode = process.wait() 

retcode तो शामिल होंगे प्रक्रिया का वापसी कोड।

अतिरिक्त: टिप्पणियों में उल्लिखित अनुसार, यह stderr को छिपाएगा नहीं। Stderr को छिपाने के लिए भी आप इसे ऐसा करेंगे:

devnull = open('/dev/null', 'w') 
process = subprocess.Popen(shlex.split(command_line), stdout=devnull, stderr=devnull) 
retcode = process.wait() 
+0

यह छिपा नहीं रहा है –

+0

@ गैब्रियल शायद आपको stderr को रीडायरेक्ट करने की आवश्यकता है? –

+0

काम किया! आपको बहुत - बहुत धन्यवाद! –

5

Popen.communicate प्रक्रिया को समाप्त करने की प्रतीक्षा करने के लिए उपयोग किया जाता है। उदाहरण के लिए:

from subprocess import PIPE, Popen 
outputTuple = Popen(["gcc", "--version"], stdout = PIPE).communicate() 

तार, stdout के लिए एक और stderr उत्पादन के लिए एक और एक के एक टपल वापस आ जाएगी।

+0

यह काम नहीं किया। यह देखने के लिए कि क्या यह कुछ बदलता है, मेरा अंतिम वाक्यांश देखें। यह जावा कार्यक्रम का एक आउटपुट है ... कृपया वहां देखें। –

+2

बस ', stderr = PIPE' जोड़ें। – AndiDog

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