पायथन सबप्रोसेस संचार विधि का उपयोग करते समय निकास कोड कैसे प्राप्त करें?


186

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

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

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

क्या मुझे इसे दूसरे तरीके से करना चाहिए?

जवाबों:


265

Popen.communicatereturncodeजब यह हो जाएगा तब विशेषता सेट करेगा (*)। यहाँ प्रासंगिक प्रलेखन अनुभाग है:

Popen.returncode 
  The child return code, set by poll() and wait() (and indirectly by communicate()). 
  A None value indicates that the process hasnt 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


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

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

5
@uglycoyote आप इसे संपादित भी कर सकते हैं जैसे कुछ हो from subprocess import Popenऔर फिर उपयोग करें जिसके Popenबजाय subprocess(or sp).Popenमैं कहूंगा कि संभवत: पठनीयता और छोटी लाइनें बढ़ जाती हैं
मिच

2
हाँ ... कॉल करना होगा process.communicate()और फिर returncodeकुछ वैरिएबल को असाइन करना होगा । यदि कॉल करने से पहले असाइनमेंट किया जाता है communicate, तो है None
पश्चिमीगुन

1
क्या पाइप को पुनर्निर्देशित किए बिना रिटर्न कोड दिखाना संभव है? मैं बैश कोड पर कॉल कर रहा हूं और मैं टर्मिनल में वास्तविक समय में आउटपुट देखना चाहता हूं
निस्बा

9

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


24
.communicate()पहले से ही उपप्रकार के समाप्त होने का इंतजार करता है।
मैकेनिकल घोंघा

8

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

प्रयत्न

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

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


जब मैंने ऐसा किया। poll () खाली था। मुझे इस काम के लिए child.poll () से ऊपर की लाइन में child.communicate () चलाना था।
NateW

1
मुझे लगता है कि आप .poll () के बजाय । प्रलेखन का उपयोग करना चाहते थे: दस्तावेज़ के अनुसार: docs.python.org/3/library/subprocess.html । ध्यान दें कि .wait () एक वैकल्पिक टाइमआउट परम लेता है जो सुविधाजनक हो सकता है।
gg99

7

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


1

इसने मेरे लिए काम किया। यह चाइल्ड प्रोसेस द्वारा लौटाए गए आउटपुट को भी प्रिंट करता है

child = subprocess.Popen(serial_script_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retValRunJobsSerialScript = 0
    for line in child.stdout.readlines():
        child.wait()
        print line           
    retValRunJobsSerialScript= child.returncode
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.