如何将脚本输出写入文件和命令行?
我有一个长时间运行的Python脚本,是通过命令行来执行的。这个脚本会把进度信息和结果写到标准输出,也就是屏幕上。我想把脚本写的所有内容都保存到一个文件里,同时又能在命令行上看到这些内容。或者,我希望输出能立即写入文件,这样我就可以用tail
命令来查看进度。我试过这样做:
python MyLongRunngingScript.py | tee log.txt
但是这样并没有产生任何输出(直接运行脚本时输出是正常的)。有没有人能给我一个简单的解决办法?我使用的是Mac OS X 10.6.4。
补充说明 我在脚本中使用print
来输出内容。
4 个回答
2
另一个简单的解决方案也可以是
python script.py > output.log
2
你看不到任何输出,可能是因为正在进行缓冲。这意味着你每输出大约4千字节的文本才会看到结果。
你可以试试这样的做法:
class OutputSplitter(object):
def __init__(self, real_output, *open_files):
self.__stdout = real_output
self.__fds = open_files
self.encoding = real_output.encoding
def write(self, string):
self.__stdout.write(string) # don't catch exception on that one.
self.__stdout.flush()
for fd in self.__fds:
try:
fd.write(string)
fd.flush()
except IOError:
pass # do what you want here.
def flush(self):
pass # already flushed
然后用一些代码把sys.stdout装饰成那个类:
stdout_saved = sys.stdout
logfile = open("log.txt","a") # check exception on that one.
sys.stdout = OutputSplitter(stdout_saved, logfile)
这样一来,所有的输出(包括print
)都会同时显示在标准输出和指定的文件里。不过可能需要调整一下,因为我没有测试过这个实现。
当然,打印信息时可能会有一点小的性能损失。
17
你走在正确的路上,但问题在于Python在缓存输出。
幸运的是,有一种方法可以告诉它不要缓存输出:
python -u MyLongRunngingScript.py | tee log.txt