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

Python 如何将脚本输出写入文件和命令行?,python,unix,command-line,Python,Unix,Command Line,我有一个从命令行运行的长时间运行的Python脚本。脚本将进度消息和结果写入标准输出。我想在文件中捕获脚本写入标准输出的所有内容,但也可以在命令行中看到它。或者,我希望输出立即转到文件,以便使用tail查看进度。我试过这个: python MyLongRunngingScript.py | tee log.txt 但它不会产生任何输出(只运行脚本会产生预期的输出)。谁能提出一个简单的解决方案?我正在使用MacOSX10.6.4 Edit我正在脚本中使用print进行输出。您可以偶尔在脚本中尝试

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

python MyLongRunngingScript.py | tee log.txt
但它不会产生任何输出(只运行脚本会产生预期的输出)。谁能提出一个简单的解决方案?我正在使用MacOSX10.6.4


Edit我正在脚本中使用
print
进行输出。

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

你看不到任何东西的事实可能与正在发生缓冲有关。因此,每4ko左右的文本只会得到一次输出

相反,请尝试以下方法:

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


当然,在打印消息时,可能会看到(大多数情况下是很小的)性能损失。

您走的是正确的道路,但问题是python缓冲输出

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

python -u MyLongRunngingScript.py | tee log.txt

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

python script.py > output.log

如果您还想捕获以下内容,请不要忘记将
stderr
流重定向到
stdout
python-u mylongruntingscript.py 2>&1 | tee log.txt