在 Linux 终端执行直接 run 代码时,可以在执行命令后加上
,在保存输出信息到文件的同时,终端仍正常打印信息。
- 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'
-