2011-02-13 10 views
14

मैं एक स्क्रिप्ट है किपायथन उपप्रजाति बच्चों के आउटपुट को फाइल और टर्मिनल में लाती है?

subprocess.call(cmdArgs,stdout=outf, stderr=errf) 

का उपयोग करते समय outf/errf या तो कोई नहीं या एक फ़ाइल वर्णनकर्ता (stdout/stderr के लिए अलग फ़ाइलें) है द्वारा निष्पादनयोग्य के एक नंबर कार्यान्वित चल रहा हूँ।

क्या कोई तरीका है कि मैं प्रत्येक exe निष्पादित कर सकता हूं ताकि stdout और stderr फ़ाइलों और टर्मिनल को एक साथ लिखा जाएगा?

+1

[asyncio संस्करण] (http://stackoverflow.com/a/25960956/4279) – jfs

उत्तर

22

call() फ़ंक्शन सिर्फ Popen(*args, **kwargs).wait() है। आप Popen सीधे कॉल और stdout=PIPE तर्क का उपयोग p.stdout से पढ़ने के लिए कर सकते हैं:

import sys 
from subprocess import Popen, PIPE 
from threading import Thread 

def tee(infile, *files): 
    """Print `infile` to `files` in a separate thread.""" 
    def fanout(infile, *files): 
     for line in iter(infile.readline, ''): 
      for f in files: 
       f.write(line) 
     infile.close() 
    t = Thread(target=fanout, args=(infile,)+files) 
    t.daemon = True 
    t.start() 
    return t 

def teed_call(cmd_args, **kwargs):  
    stdout, stderr = [kwargs.pop(s, None) for s in 'stdout', 'stderr'] 
    p = Popen(cmd_args, 
       stdout=PIPE if stdout is not None else None, 
       stderr=PIPE if stderr is not None else None, 
       **kwargs) 
    threads = [] 
    if stdout is not None: threads.append(tee(p.stdout, stdout, sys.stdout)) 
    if stderr is not None: threads.append(tee(p.stderr, stderr, sys.stderr)) 
    for t in threads: t.join() # wait for IO completion 
    return p.wait() 

outf, errf = open('out.txt', 'w'), open('err.txt', 'w') 
assert not teed_call(["cat", __file__], stdout=None, stderr=errf) 
assert not teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0) 
assert teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf) 
+0

धन्यवाद, उपप्रोकैस के बजाए आप क्या करेंगे। क्या मैं subprocess.Popen (और नहीं) का उपयोग करके एकाधिक निष्पादन चलाने की इच्छा रखता हूं कॉल), जहां प्रत्येक निष्पादन एक अलग फ़ाइल और टर्मिनल – user515766

+1

@ user515766 पर लिखता है: समाधान वही है: 'stdout',' stderr' को 'PIPE' पर सेट करें और' tee() 'को कॉल करें जब आप चाहें एक से अधिक जगह पर लिखें। – jfs

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद, लेकिन यह काम नहीं करता है। बाहरी प्रक्रिया केवल ओएस-स्तरीय फ़ाइल हैंडल देखती है (आपके फ़ाइल ऑब्जेक्ट्स पर fileno() विधि से आपको प्राप्त करने वाली संख्या)। http://bytes.com/topic/python/answers/541085-extend-file-type देखें – user515766

0

उपयोग | tee जबकि टर्मिनल पर उत्पादन हो रही out.txt नाम की एक फ़ाइल के लिए उत्पादन को अंतरित करें।

import subprocess 

# Run command and redirect it by | tee to a file named out.txt 
p = subprocess.Popen([command, '|', 'tee', 'out.txt']) 
p.wait() 

विंडोज प्लेटफ़ॉर्म में, कोई नहीं है। टी। हमें पावरहेल का उपयोग करने की आवश्यकता है। तो तीसरी पंक्ति को आदेश हो जाता है:

# Run command in powershell and redirect it by | tee to a file named out.txt 
p = subprocess.Popen(['powershell','command, '|', 'tee', 'out.txt']) 

इस वैसे, stdout छपा है और stdout भी फ़ाइल out.txt में संग्रहीत किया जाएगा।

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