2009-03-29 16 views
6

मुझे आशा है कि यह एक साधारण पायथन प्रश्न है।उपप्रोसेसर क्यों नहीं है। पोपेन (...) हमेशा वापस आते हैं?

जब मैं अजगर दुभाषिया में निम्न प्रयास करें:

>>> import process 
>>> def test(cmd): 
... p = subprocess.Popen(cmd) 
... 
>>> test(['ls', '-l']) 

यह ls -l चलेगा, लेकिन मैं "वापसी" हिट करने के लिए एक नया >>> शीघ्र प्राप्त करने की आवश्यकता।

हालांकि

, जब मैं निम्न प्रयास करें:

>>> import process 
>>> def test(cmd): 
... p = subprocess.Popen(cmd) 
... p.wait() 
... 
>>> test(['ls', '-l']) 

फिर ls -l एक >>> शीघ्र तुरंत वर्तमान के साथ चलाया जाएगा।

एक अन्य भिन्नता:

>>> import process 
>>> def test(cmd): 
... p = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
... 
>>> test(['ls', '-l']) 

यह मैं एक तत्काल नई शीघ्र दे देंगे।

अंतिम उदाहरण जो मैं चाहता हूं उसके सबसे नज़दीक है। मेरा लक्ष्य एक बच्चे की प्रक्रिया शुरू करना है, इसे खत्म करने के लिए प्रतीक्षा करें और उसके बाद p.stdout का जिक्र करते हुए मेरी मूल प्रक्रिया में अपने stdout का उपयोग करें जबकि stderr को अन्यथा कहीं भी प्रिंट करें।

अभी मेरे वास्तविक एप्लिकेशन में, अंतिम संस्करण केवल p = subprocess.Popen(cmd, stdout=subprocess.PIPE) पर p.wait() के साथ या बिना लटकता है।

धन्यवाद,

चार्ली

उत्तर

7

मैं अपने ही सवाल का जवाब हो सकता है। मेरा मानना ​​है कि अंतिम मामले में, मुझे अपनी प्रक्रिया जारी रखने के लिए स्पष्ट रूप से p.stdout से पढ़ने की आवश्यकता है।

अर्थात्:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
output = p.stdout.readlines() 
.... 

धन्यवाद सभी

8

पहले विभिन्नता में, test() रिटर्न तुरंत प्रक्रिया शुरू करने के बाद, लेकिन इससे पहले इसके उत्पादन कंसोल के लिए भेजा जाता है।

यदि आप आउटपुट को देखते हैं तो ls के आउटपुट से पहले तुरंत प्राप्त करें।

>>> test(['ls', '-l']) 
>>> total 0       <----- test() returns, new propmpt 
--rw-r--r-- 1 foo bar 7 Mar 24 17:38 
etc etc 

दूसरी भिन्नता में, test() से पहले ही रिटर्न को समाप्त करने की प्रक्रिया के लिए प्रतीक्षा कर रहा है।

तीसरे संस्करण में, आप सही हैं कि इसे जारी रखने के लिए आपको बच्चे की प्रक्रिया के stdout से पढ़ना पड़ सकता है।

0

बस संवाद() विधि का उपयोग करें। वापस जाने की आवश्यकता नहीं है।

>>> test(['ls', '-l']) 
>>> 
>>> def test(cmd): 
... p = subprocess.Popen(cmd).communicate() 
... 
>>> test(['ls', '-l']) 
+1

उप कमांड के किसी भी स्टड हैंडलर को रीडायरेक्ट किए बिना, '.communicate()' कुछ भी उपयोगी नहीं होगा। इसे 'प्रतीक्षा()' कॉल के साथ प्रतिस्थापित करना बेहतर हो सकता है। – glglgl

0

यहां एक आदेश है जो Google को हमेशा के लिए पिंग करता है, इसलिए इसे आउटपुट पुनर्प्राप्त करने के लिए मैन्युअल रूप से समाप्त करने की आवश्यकता होती है।

os.popen() विधि कॉल को पूर्ण subprocess.Popen कक्षाओं में कनवर्ट करने के निर्देशों के लिए subprocess documentation देखें।

host = "www.google.com" 
command = "ping %s -t"%host 

#p = os.popen(command) -- using Popen instead of os.popen() to allow calling terminate() 
p = Popen(command, stdout=subprocess.PIPE) 

time.sleep(5) 
print "term" 
p.terminate() 
pingResultSoFar = p.communicate()[0] # get what has been printed to standard out so far 
print pingResultSoFar 
संबंधित मुद्दे