如何将脚本输出写入文件和命令行?

7 投票
4 回答
8276 浏览
提问于 2025-04-16 04:36

我有一个长时间运行的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

撰写回答