2011-11-09 8 views
8

से वापसी मूल्य मैं लॉगिंग जानकारी प्रदर्शित करने के साथ आउटपुट (प्रिंट स्टेटमेंट) और पाइथन उपप्रोसेस से वापसी की स्थिति प्राप्त करना चाहता हूं। मैं विंडोज एक्सपी पर पायथन 2.5 का उपयोग कर रहा हूं। मैं रिटर्न कोड भी कैसे प्राप्त करूं? यहां इस निकालने में, मैं आउटपुट पढ़ रहा हूं ताकि मैं इसे एक अलग थ्रेड में wxPython TextCtrl में प्रदर्शित करने के लिए रीडायरेक्ट कर सकूं।पायथन उपप्रोसेस

self.myproc.poll()      
if self.myproc.returncode is None:    
    # Still running so check stdout 
    txt = self.myproc.stdout.read(self._readblock)  
    if txt:   
     # Add to UI's update queue 
     self._parent.AppendUpdate(txt)   
    else: 
     break  

उत्तर

7

returncode poll कॉल द्वारा दिया जाता है, और यह भी (एक बार pollNone वापस नहीं किया था) 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

मेरी प्रक्रिया में कमांड एक पायथन फ़ाइल है और उदाहरण के लिए एक मान देता है जैसे 'पास' या 'विफल'।मुझे बस 0 या 1 – user974168

+0

आह जैसे वापसी मूल्य मिल रहे थे, तो आपको केवल 'stdout' की अंतिम पंक्ति का विश्लेषण करने की आवश्यकता है। रिटर्न कोड प्रोग्राम की निकास स्थिति का एक संकेत है, और एक पूर्णांक है। – jro

+0

मुझे खेद है कि मैंने आपकी टिप्पणी नहीं समझा। तर्क की खातिर बुलाया प्रक्रिया इस मुख्य डीईएफ़ की तरह है(): एक = 5 ख = 6 c = ए + बी प्रिंट ग वापसी 'पास' अगर __name__ == '__main__': मुख्य() यहां वापसी मूल्य 'पास' कैसे मिलेगा? – user974168

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