将无延迟的输出重定向到Python中的文件

时间:2014-02-24 07:40:39

标签: python python-2.7

我正在寻找一种方法将标准输出的输出重定向到文件而没有延迟。 使用以下代码写入文件似乎没问题:

import time  
import sys,os
def test():
    j = 1
    while j < 10 :
        time.sleep(1)
        print("Python is good .Iteration ",j )
        j +=1

if __name__ == "__main__":
    myFile= open( "logFile.log", "w", 0 )
    sys.stdout= myFile
    test()

但是,这仅在代码完成时写入文件,即在第9次迭代之后。我想知道我们是否可以在完成整个代码之前将数据写入文件,并通过执行tail -f logFile.log来查看文件中的输出

提前致谢

4 个答案:

答案 0 :(得分:2)

这是因为没有任何东西正在刷新输出缓冲区。 请尝试偶尔将其添加到您的代码中:

sys.stdout.flush()

它并不完美,但应该有效 它也是一大早,可能有一个比这更好的解决方案,但我刚才提出了这个想法:

class log():
    def __init__(self, file):
        self.file = open(file, 'r', 0)

    def write(self, what):
        self.file.write(what)
        self.file.flush()

    def __getattr__(self, attr):
       return getattr(self.file, attr)

sys.stdout = log()
哈哈,是的,这是愚蠢的明显解决方案,所以我将分数指向那个帖子:P击败它30秒:)

答案 1 :(得分:2)

一个简单的解决方案是为python命令添加-u选项以强制使用无缓冲的stdin,stdout和stderr。

python -u myscript.py

答案 2 :(得分:1)

对于每次迭代,您都必须添加它。

sys.stdout.flush()

这会刷新输出缓冲区,并相当于打开和关闭文件,以便附加更改。

但是,我没有看到它最后附加所有数据有什么问题,因为你仍然会得到相同的结果,并且无论如何你在该程序正在使用它时都无法从外部访问该文件。 / p>

答案 3 :(得分:0)

输出被缓冲,因为将更大的数据块写入文件更有效。 您可以显式flush()缓冲区,也可以使用sys.stderr作为输出。对于更大的项目,第三种方法可能是更好的解决方案,使用python中包含的logging模块。它允许您使用不同的日志级别引发消息,并以不同方式重定向这些日志级别,包括直接刷新到文件。