returncode poll
कॉल द्वारा दिया जाता है, और यह भी (एक बार poll
None
वापस नहीं किया था) returncode
विशेषता के माध्यम से सुलभ है। आप पहले से ही अपने कोड में इसका उपयोग कर रहे हैं, इसलिए मुझे यकीन नहीं है कि इसके साथ आपकी समस्या क्या है।
जब आपके प्रक्रिया चल रहा है अपने नियंत्रण को अद्यतन करना चाहते हैं, readline
बजाय read
का उपयोग करें: उत्तरार्द्ध पूरे उत्पादन उपस्थित होना, जबकि पूर्व एक नई पंक्ति चरित्र पर इंतजार करेंगे इंतजार करेंगे। अपने चर नाम का उपयोग कर एक पूर्ण उदाहरण के लिए:
from subprocess import Popen, PIPE
self.myproc = Popen('dir /s', shell=True, stdout=PIPE, stderr=PIPE)
while self.myproc.poll() == None:
self._parent.AppendUpdate(self.myproc.stdout.readline())
self._parent.AppendUpdate('Return code was ' + self.myproc.returncode)
ध्यान दें कि आप .strip()
करने के लिए readline
परिणाम चाहते हो सकता है के रूप में यह न्यू लाइन चरित्र शामिल होंगे।
संपादित करें: स्क्रिप्ट आउटपुट और उसके रिटर्न कोड के बीच आपके भ्रम को दूर करने के लिए, निम्नलिखित। सबसे पहले, मॉड्यूल स्तर पर एक पायथन लिपि एक मान वापस नहीं कर सकता है: जो एक वाक्यविन्यास त्रुटि उत्पन्न करेगा। तो आपको स्क्रिप्ट का आउटपुट, और रिटर्न कोड देने के बीच क्या अंतर करना चाहिए।
स्क्रिप्ट का आउटपुट उपरोक्त उदाहरण में self.myproc.stdout.readline
विधि का उपयोग करके पढ़ा जाता है। हर बार जब बाहरी प्रक्रिया ने आउटपुट किए गए टेक्स्ट की एक पंक्ति बनाई है, तो उस फ़ंक्शन को कॉल करना इसे पुनर्प्राप्त करेगा।
रिटर्न कोड हालांकि (या बाहर निकलने की स्थिति) एक पूर्णांक है जो एक बच्चे की प्रक्रिया से माता-पिता (आपकी) प्रक्रिया में पारित हो जाता है, जो उस स्थिति को इंगित करता है जिसमें बाल प्रक्रिया निकलती है। पायथन में, आप इसे sys.exit
फ़ंक्शन के साथ करते हैं। आमतौर पर, जब यह मान शून्य होता है तो यह सफलता को इंगित करता है; एक गैर-शून्य मान किसी प्रकार की त्रुटि दर्शाता है।
अपने बच्चे प्रक्रिया स्क्रिप्ट इस तरह दिखता है कहते हैं:
import sys
# Do some stuff
print 'pass' # Gets to stdout
sys.exit(0) # Return code
इस बाहरी फ़ाइल निष्पादित Popen
वर्ग के साथ, हम pass
मिल जाएगा जब हम self.myproc.stdout
पढ़ा (यह test.py
कॉल), और 0
जब हम पढ़ पहले मतदान के बाद self.myproc.poll
(या self.myproc.returncode
)।
इस रिटर्न कोड का उद्देश्य यह है कि आपको यह निर्धारित करने के लिए सभी बाल प्रक्रिया 'आउटपुट का विश्लेषण नहीं करना है कि यह अपने काम में सफल हुआ है या नहीं: आप अपने स्वयं के निकास कोड को परिभाषित करने के लिए स्वतंत्र हैं। उदाहरण के लिए, आप एक सफल होने के लिए 0
पर विचार कर सकते हैं, 1
विफलता होने के लिए, 2
किसी प्रकार का अमान्य इनपुट दिया गया है, 9
एक अज्ञात त्रुटि, और इसी तरह। इस तरह, आप प्रक्रिया को poll
रख सकते हैं, और उस सर्वेक्षण द्वारा लौटाए गए निकास कोड के आधार पर आप सीधे जानते हैं कि यह सफल था या नहीं। ध्यान दें कि यह आपके मामले पर थोड़ा कम लागू है क्योंकि आपको बाल प्रक्रिया के आउटपुट की आवश्यकता है, लेकिन फिर भी सफलता निर्धारित करने के लिए स्ट्रिंग की तुलना में किसी संख्या को पार्स करना आसान है।
मेरी प्रक्रिया में कमांड एक पायथन फ़ाइल है और उदाहरण के लिए एक मान देता है जैसे 'पास' या 'विफल'।मुझे बस 0 या 1 – user974168
आह जैसे वापसी मूल्य मिल रहे थे, तो आपको केवल 'stdout' की अंतिम पंक्ति का विश्लेषण करने की आवश्यकता है। रिटर्न कोड प्रोग्राम की निकास स्थिति का एक संकेत है, और एक पूर्णांक है। – jro
मुझे खेद है कि मैंने आपकी टिप्पणी नहीं समझा। तर्क की खातिर बुलाया प्रक्रिया इस मुख्य डीईएफ़ की तरह है(): एक = 5 ख = 6 c = ए + बी प्रिंट ग वापसी 'पास' अगर __name__ == '__main__': मुख्य() यहां वापसी मूल्य 'पास' कैसे मिलेगा? – user974168