2009-11-30 12 views
6

से stdout पढ़ें। मैं subprocess.popen का उपयोग कर एक उप-प्रोग्राम चला रहा हूं। जब मैं कमांड विंडो (cmd.exe) से अपना पायथन प्रोग्राम शुरू करता हूं, तो प्रोग्राम खिड़की में कुछ जानकारी और तिथियां लिखता है क्योंकि प्रोग्राम विकसित होता है।असुरक्षित रूप से subprocess.Popen

जब मैं एक कमांड विंडो में अपना पायथन कोड नहीं चलाता, तो यह इस उप-प्रोग्राम के आउटपुट के लिए एक नई कमांड विंडो खोलता है, और मैं इससे बचना चाहता हूं। जब मैं निम्नलिखित कोड का इस्तेमाल किया है, यह cmd विंडो प्रदर्शित नहीं करता है, लेकिन यह भी स्थिति मुद्रित नहीं करता है:

p = subprocess.Popen("c:/flow/flow.exe", shell=True, stdout=subprocess.PIPE) 
print p.stdout.read() 

मैं अपने कार्यक्रम के उत्पादन में उप कार्यक्रम के उत्पादन कैसे दिखा सकते हैं के रूप में यह होता है?

+2

यह समुदाय विकी क्यों है? –

+2

"विंडोज़ विंडो" विंडोज विंडो क्या है? क्या आप एक जीयूआई ढांचे का उपयोग कर रहे हैं? कौनसा? –

+0

अच्छी तरह से, मैं arcgis के माध्यम से मॉडल चला रहा हूँ। जब मैं अपने उपकरण पर क्लिक करता हूं तो मैंने वहां बनाया, एक खिड़की आती है और प्रगति दिखाती है। मैं अपनी कमांड विंडो में दिखाई देने वाली रेखाएं देखना चाहता हूं। – Mesut

उत्तर

7

इस का उपयोग करें:

cmd = subprocess.Popen(["c:/flow/flow.exe"], stdout=subprocess.PIPE) 
for line in cmd.stdout: 
    print line.rstrip("\n") 
cmd.wait() # you may already be handling this in your current code 

ध्यान दें कि आप अभी भी उप कार्यक्रम के लिए प्रतीक्षा करने के लिए अपने stdout बफर (जो आमतौर पर अलग ढंग से बफ़र किया जाता है जब एक टर्मिनल विंडो के लिए लिख नहीं) फ्लश करने के लिए होगा, इसलिए आप कर सकते हैं सब-लाइन तत्काल रूप से नहीं देखते क्योंकि सब-प्रोग्राम इसे प्रिंट करता है (यह विभिन्न ओएस विवरणों और उप-कार्यक्रम के विवरण पर निर्भर करता है)।

यह भी ध्यान दें कि मैंने खोल = सही कैसे हटा दिया है और स्ट्रिंग तर्क को एक सूची के साथ प्रतिस्थापित किया है, जिसे आम तौर पर अनुशंसित किया जाता है।

+0

वैकल्पिक रूप से 'line.rstrip ..' के लिए आप 'लाइन' का उपयोग कर सकते हैं (पिछली कॉमा नोट करें) –

+2

['iter (cmd.stdout.readline," में लाइन के लिए "): प्रिंट लाइन, '] (http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line) फ़ाइल इटरेटर में रीड-बफर बफर से बचने के लिए अधिक तत्काल आउटपुट प्रदान कर सकता है (ध्यान दें: उप-कार्यक्रम को अभी भी अपने स्टडआउट को फ्लश करना है) – jfs

+1

यह न देखें कि यह एसिंक क्यों है। – ManuelSchneid3r

0

यह एक पुरानी पोस्ट है, लेकिन समाधान खोजने में कठिनाई के साथ एक आम समस्या है। इस प्रयास करें: http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subprocess-use-on-win/

+0

दुर्भाग्य से इस समाधान में असीमित नहीं है। – Tino

1

एक नुस्खा popen डेटा संसाधित करने के लिए खोज रहे एसिंक्रोनस रूप से मैं http://code.activestate.com/recipes/576759-subprocess-with-async-io-pipes-class/

यह काफी होनहार लग रहा है पर ठोकर खाई, हालांकि मैं धारणा है कि इसमें कुछ गलत वर्तनी हो सकता है मिल गया। अभी तक कोशिश नहीं की

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