2010-06-08 15 views
16

का उपयोग करके मैं subprocess मॉड्यूल का उपयोग करने वाला एक छोटा ऐप लिखने की कोशिश कर रहा हूं।सबप्रोसेस प्रतीक्षा() और मतदान()

मेरा प्रोग्राम बाहरी बैश कमांड को कॉल करता है जिसमें प्रक्रिया करने में कुछ समय लगता है। इस समय के दौरान, मैं उपयोगकर्ता को इस तरह के संदेशों की एक श्रृंखला दिखाना चाहता हूं:

प्रसंस्करण। कृपया प्रतीक्षा करें ...
उत्पादन foo()

मैं इस का उपयोग कर Popen.wait() या Popen.poll() कैसे कर सकते है। मैंने पढ़ा है कि मुझे Popen.returncode का उपयोग करने की आवश्यकता है, लेकिन मैं सक्रिय रूप से राज्य की जांच कैसे कर सकता हूं, मुझे नहीं पता।

उत्तर

16

दोनों wait() (निर्दिष्ट timeout के साथ) और poll() वापसी None यदि प्रक्रिया समाप्त हो गया है, तो प्रक्रिया अभी तक पूरी नहीं हुई है, और कुछ अलग है (मैं एक पूर्णांक, बाहर निकलें कोड लगता है, उम्मीद है कि 0)।

संपादित:

wait() और poll() अलग व्यवहार है:

  • wait (बिना टाइमआउट तर्क) ब्लॉक और प्रक्रिया को पूरा करने के लिए इंतजार करेंगे।
  • wait टाइमआउट तर्क के साथ प्रक्रिया पूरी होने के लिए timeout सेकंड प्रतीक्षा करेगा। यदि यह पूरा नहीं होता है, तो यह TimeoutExpired अपवाद फेंक देगा। यदि आप अपवाद पकड़ते हैं, तो आपको फिर से जाने के लिए, या wait पर जाने के लिए आपका स्वागत है।
  • poll हमेशा तुरंत लौटता है। यह प्रभावी रूप से 0 के टाइमआउट के साथ प्रतीक्षा करता है, कोई अपवाद पकड़ता है, और प्रक्रिया पूरी होने पर None देता है।
  • या तो wait या poll साथ
  • , प्रक्रिया पूर्ण कर लिया है, popen वस्तु की returncode का गठन किया जाएगा (अन्यथा यह कोई नहीं है - आप wait या poll बुला के रूप में के रूप में आसानी के लिए जाँच कर सकते हैं), और समारोह से वापसी मान भी होगा प्रक्रिया का रिटर्न कोड बनें।

</संपादित करें>

तो मुझे लगता है कि आप की तरह कुछ करना चाहिए:

while myprocess.poll() is None: 
    print("Still working...") 
    # sleep a while 

ध्यान रखें कि यदि पार्टी स्क्रिप्ट उत्पादन का एक बहुत बनाता है आप communicate() या कुछ का उपयोग करना चाहिए बनें stdout या stderr को भरने के लिए रोकने के समान।

+0

मैं संवाद() का उपयोग कर रहा हूं। लेकिन मुझे यह नहीं पता कि प्रक्रिया को निष्पादित होने पर मैं रिटर्नकोड कैसे वापस कर सकता हूं। – user225312

+0

मैंने इसे करने से इसे हल किया: यदि process.poll() कोई नहीं है: 'कार्य' प्रिंट करें – user225312

+4

यह उत्तर गलत है। @ Onlynone के उत्तर की जांच करें –

23

@ extraneon का जवाब थोड़ा पीछे है। प्रक्रिया समाप्त होने पर wait() और poll() दोनों प्रक्रिया के निकास कोड को वापस कर दें।poll() विधि None वापस आ जाएगी, तो प्रक्रिया अभी भी चल रहा है और जब तक प्रक्रिया बाहर निकल जाता है wait() विधि को अवरुद्ध कर देगा:

निम्नलिखित पृष्ठ चेक आउट: https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

चेक अगर बच्चे प्रक्रिया है समाप्त हो गया। रिटर्नकोड विशेषता सेट करें और वापस करें।

बच्चे प्रक्रिया समाप्त करने के लिए के लिए Popen.wait()

प्रतीक्षा। रिटर्नकोड विशेषता सेट करें और वापस करें।

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