2009-05-19 9 views
13

एक स्क्रिप्ट में, मैं कुछ कमांड लाइन पैरामीटर के साथ "-a" के रूप में एक .exe चलाने के लिए, और फिरपायथन में फ़ाइल में .exe के आउटपुट को रीडायरेक्ट कैसे करें?

प्रोग्राम के मानक आउटपुट को फ़ाइल में रीडायरेक्ट करना चाहता हूं?

मैं इसे कैसे कार्यान्वित कर सकता हूं?

उत्तर

23

आप उपप्रक्रिया का उपयोग कर एक फाइल करने के लिए सीधे अनुप्रेषित कर सकते हैं:

3) stdout वापस डिफ़ॉल्ट पर पुन: निर्देशित करना न भूलें।

import subprocess 
with open('output.txt', 'w') as output_f: 
    p = subprocess.Popen('Text/to/execute with-arg', 
         stdout=output_f, 
         stderr=output_f) 
7

सबसे आसान os.system("the.exe -a >thefile.txt") है, लेकिन कई अन्य तरीके हैं, उदाहरण के लिए मानक पुस्तकालय में subprocess मॉड्यूल के साथ।

+0

उस सबप्रोसेस का उपयोग कैसे करें? – Kim

+0

http://docs.python.org/library/subprocess.html#replacing-os-system देखें। –

+3

चीजों को पुनर्निर्देशित करने के लिए os.system का उपयोग करने की कोशिश करते समय पाइप प्रतीक ऑपरेटिंग सिस्टम के बीच अलग है ... – mavnn

3

आप इस जैसे कुछ कर सकते हैं उदा। (या किसी अन्य आदेश) ls -l का आउटपुट

p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE) 
print p.stdout.read() # or put it in a file 

आप stderr के लिए इसी तरह की बात कर सकते हैं पढ़ने के लिए/stdin

लेकिन जैसा कि एलेक्स एक फ़ाइल में अगर आप सिर्फ यह चाहते उल्लेख किया है, बस cmd अनुप्रेषित एक फ़ाइल

+0

यदि यह एक लंबी चल रही प्रक्रिया है, तो सावधान रहें कि stdout.read() अवरुद्ध है। यदि स्क्रिप्ट किसी और चीज को जारी रखने या आउटपुट 'लाइव' का जवाब देने जा रही है तो आप सबप्रोसेस को एक अलग थ्रेड पर चलाना चाहेंगे। – mavnn

0

यदि आप केवल निष्पादन योग्य चलाने और परिणामों की प्रतीक्षा करना चाहते हैं, तो अनुराग का समाधान शायद सबसे अच्छा है। मुझे आउटपुट की प्रत्येक पंक्ति का जवाब देने की आवश्यकता थी, और निम्नलिखित काम किया:

1) एक ऑब्जेक्ट को एक लिखें (टेक्स्ट) विधि के साथ बनाएं। इसे stdout रीडायरेक्ट करें (sys.stdout = obj)। अपनी लेखन विधि में, आउटपुट के साथ आने के साथ सौदा करें।

2) निम्नलिखित कोड की तरह कुछ के साथ एक अलग धागे में एक विधि चलाएँ:

p = subprocess.Popen('Text/to/execute with-arg', stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, shell=False) 
    while p.poll() is None: 
     print p.stdout.readline().strip() 

क्योंकि आप stdout पुनः निर्देशित किया है, पाइप उत्पादन अपने लिखने विधि लाइन के लिए लाइन द्वारा भेज देंगे। यदि आप निश्चित नहीं हैं कि आपको लाइन ब्रेक मिलेंगे, तो पढ़िए (राशि) भी काम करता है, मुझे विश्वास है। sys.stdout = __sys.stdout__

0

हालांकि शीर्षक (.exe) लगता है कि यह विंडोज पर एक समस्या है। मुझे यह साझा करना था कि स्वीकार्य उत्तर (subprocess.Popen() stdout/stderr तर्कों के साथ) मैक ओएस एक्स (10.8) पर पाइथन 2.7 के साथ मेरे लिए काम नहीं करता था।

मुझे इसे काम करने के लिए subprocess.check_output() (पायथन 2.7 और ऊपर) का उपयोग करना पड़ा। उदाहरण:

import subprocess 

cmd = 'ls -l' 
out = subprocess.check_output(cmd, shell=True) 
with open('my.log', 'w') as f: 
    f.writelines(out) 
    f.close() 

ध्यान दें कि यह समाधान प्रोग्राम समाप्त होने पर सभी संचित आउटपुट लिखता है। यदि आप रन के दौरान लॉग फ़ाइल की निगरानी करना चाहते हैं। आप कुछ और कोशिश कर सकते हैं। मेरे अपने मामले में, मुझे केवल अंतिम परिणाम की परवाह है।

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