在 Linux 终端执行直接 run 代码时,可以在执行命令后加上 2>&1
,在保存输出信息到文件的同时,终端仍正常打印信息。
python run.py 2>&1 | tee train.log
将控制台打印的信息保存到当前目录下,文件命名为 train.log,如果要指定保存路径,只需要在 train.log 前加上对应的路径,比如:
python run.py 2>&1 | tee backup/train.log
重定向标准输出流有两种方式:
1)在每个单独的 print 方法中重定向,需要在每个 printf 中进行修改:
# assume the log file is 'train.log'
# for python2
print >> train.log, 'print content'
# for python3
print('print content', file=train.log)
2)在全局设置重定向,比单独设置要方便很多,在 python 文件里添加:
# assume the log file is 'train.log'
import sys
f = open('train.log', 'train')
sys.stdout = f
sys.stderr = f # redirect std err, if necessary
这两种重定向方法的缺点在于:控制台不再打印信息,可能对观察程序执行状态造成不便。
可以在python程序中自定义一个记录者类,用来同时写文件以及在控制台进行显示。一个例子如下:
import sys
class Logger(object):
def __init__(self, filename='default.log', stream=sys.stdout):
self.terminal = stream
self.log = open(filename, 'a')
def write(self, message):
self.terminal.write(message)
self.log.write(message)
def flush(self):
pass
sys.stdout = Logger(a.log, sys.stdout)
sys.stderr = Logger(a.log_file, sys.stderr) # redirect std err, if necessary
# now it works
print 'print something'