2011-04-12 10 views
133

पायथन के subprocess मॉड्यूल और communicate() विधि का उपयोग करते समय मैं निकास कोड कैसे पुनर्प्राप्त करूं?पायथन उपप्रोसेस संचार विधि का उपयोग करते समय निकास कोड कैसे प्राप्त करें?

प्रासंगिक कोड:

import subprocess as sp 
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0] 

मैं इस एक और तरीका कर रही किया जाना चाहिए?

उत्तर

187

Popen.communicate यह किए जाने पर returncode विशेषता सेट करेगा (*)।

Popen.returncode 
    The child return code, set by poll() and wait() (and indirectly by communicate()). 
    A None value indicates that the process hasn’t terminated yet. 

    A negative value -N indicates that the child was terminated by signal N (Unix only). 

तो आप बस कर सकते हैं (मैं इसे परीक्षण नहीं किया था, लेकिन यह काम करना चाहिए):

import subprocess as sp 
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE) 
streamdata = child.communicate()[0] 
rc = child.returncode 

(*) इसका कारण यह है रास्ते से होता है यहाँ प्रासंगिक दस्तावेज अनुभाग है यह कार्यान्वित किया गया है: बच्चे की धाराओं को पढ़ने के लिए थ्रेड सेट करने के बाद, यह केवल wait पर कॉल करता है।

+7

इस उदाहरण ने मेरी मदद की, लेकिन यह अच्छा होगा अगर उदाहरणों ने एक अस्पष्ट संक्षेप के रूप में कुछ मानक आयात करने के "आयात उपप्रोसेस एसपी" पैटर्न नहीं किया। हालांकि यह इसके बाद वाले कोड से 8 वर्णों को ट्रिम करता है, यह समझना और पुन: उपयोग करना भी मुश्किल बनाता है। – uglycoyote

+5

@uglycoyote कोई नियम नहीं है जो कहता है कि आपको कॉपी और पेस्ट करना है। बस इसे फिर से टाइप करें, हालांकि आप चाहते हैं, यह 4 लाइनों की तरह है। –

+0

@uglycoyote आप इसे 'सबप्रोसेस आयात पॉपन' से कुछ भी संपादित करने के लिए संपादित कर सकते हैं और फिर 'सबप्रोसेस (या एसपी) के बजाय' पॉपन 'का उपयोग करें। जो मैं कहूंगा वह शायद पठनीयता बढ़ाता है और लाइनों को कम करता है – Mitch

4

exitcode = data.wait()। बाल प्रक्रिया को अवरुद्ध कर दिया जाएगा यदि यह मानक आउटपुट/त्रुटि को लिखता है, और/या मानक इनपुट से पढ़ता है, और कोई सहकर्मी नहीं हैं।

7

आपको पहले यह सुनिश्चित करना चाहिए कि प्रक्रिया चल रही है और .wait विधि का उपयोग कर रिटर्न कोड पढ़ा गया है। यह कोड वापस कर देगा। यदि आप बाद में इसका उपयोग करना चाहते हैं, तो इसे Popen ऑब्जेक्ट में संग्रहीत किया गया है।

+15

'.communicate()' पहले ही उपप्रजाय को समाप्त करने की प्रतीक्षा कर रहा है। –

1

.poll() रिटर्न कोड अपडेट करेगा।

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE) 
returnCode = child.poll() 

इसके अलावा कोशिश करें, के बाद .poll() कहा जाता है वापसी कोड child.returncode के रूप में वस्तु में उपलब्ध है।

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