Skip to main content
 首页 » 编程设计

python之将所有标准输出存储到文件中,同时仍将其显示在屏幕上

2025年05月04日15itcoder

除了python,这里似乎有所有语言的问题/答案。 (至少我没找到)

从这个问题Redirect stdout to a file in Python?我了解到,为了将所有输出从屏幕重定向到一个文件,我只需要使用:

import sys 
 
some_list = ['elem1', 'elem2'] 
 
for elem in some_list: 
 
    sys.stdout = open(elem + '.log', 'w') 
 
    # Do lots of stuff that print messages. 
    print 'lots of stuff for', elem 
 
print 'Code finished' 

这会将所有输出存储到 elemx.log文件:

elem1.log 
lots of stuff for elem1 
 
elem2.log 
lots of stuff for elem2 
Code finished 

关于这种方法我有两个问题:

1- 如何使最后一行打印行(即:Code finished)不存储在为最后一个 elem 创建的文件中?

2- 如何让存储的输出同时显示在屏幕上?

请您参考如下方法:

wrapper 很性感

import sys 
 
class Logger(file): 
    def __init__(self,*a,**kw): 
        # copy original stdout to instance 
        self.stdout = sys.stdout 
        return super(Logger,self).__init__(*a,**kw) 
 
    def write(self,data): 
        self.stdout.write(data) # to screen 
        return super(Logger,self).write(data) #to file 
 
    def writelines(self,lines): 
        for line in lines: self.write(line) 
 
    def close(self): 
        # return it back 
        sys.stdout = self.stdout 
 
 
 
some_list = ['elem1', 'elem2'] 
 
for elem in some_list: 
    with Logger("/tmp/1/{}.log".format(elem), "w") as sys.stdout: 
    # Do lots of stuff that print messages. 
        print 'lots of stuff for', elem 
 
 
 
print 'Code finished' 

结果

$ python2 out.py  
Code finished 
$ ls 
elem1.log  elem2.log  out.py 

很酷的副作用:

print 'this on screen' 
 
with Logger("/tmp/1/main.log", "w") as sys.stdout: 
     print 'this on screen an in main.log' 
 
     with Logger("/tmp/1/sub.log", "w") as sys.stdout: 
          print 'this on screen, in man.log and in sub.log' 
 
print 'only on screen again'