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

时间:2010-09-26 13:23:41

标签: python unix command-line

我有一个长期运行的Python脚本,我从命令行运行。该脚本将进度消息和结果写入标准输出。我想捕获脚本写入文件中标准输出的所有内容,但也要在命令行中查看它。或者,我希望输出立即转到文件,因此我可以使用tail来查看进度。我试过这个:

python MyLongRunngingScript.py | tee log.txt

但它不会产生任何输出(只是运行脚本会产生预期的输出)。谁能提出一个简单的解决方案?我使用的是Mac OS X 10.6.4。

修改我在我的脚本中使用print输出。

4 个答案:

答案 0 :(得分:16)

你是在正确的道路上,但问题是python缓冲输出。

幸运的是,有一种方法可以告诉它不要缓冲输出:

python -u MyLongRunngingScript.py | tee log.txt

答案 1 :(得分:2)

您没有看到任何内容的事实可能与缓冲正在发生的事实有关。所以你只能每4 Ko左右输出一次文本。

相反,尝试这样的事情:

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)都会刷新到标准输出和指定文件。可能需要调整,因为我还没有测试过该实现。

当然,打印消息时,预计会看到(大部分时间很小)性能损失。

答案 2 :(得分:1)

您可以尝试在脚本中偶尔执行sys.stdout.flush(),然后再次使用tee。当stdout被重定向到tee时,它可能会被缓冲的时间超过直接到达终端的时间。

答案 3 :(得分:1)

另一个简单的解决方案可能是

python script.py > output.log