我正在寻找一种方法将标准输出的输出重定向到文件而没有延迟。 使用以下代码写入文件似乎没问题:
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来查看文件中的输出
提前致谢
答案 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
模块。它允许您使用不同的日志级别引发消息,并以不同方式重定向这些日志级别,包括直接刷新到文件。