2014-02-24 56 views
0

我正在寻找一种方法将输出从标准输出重定向到文件而不会延迟。 写入文件似乎确定使用下面的代码:将输出无延迟地重定向到Python中的文件

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次迭代后的代码,即完成。我想知道,如果我们可以写数据到整个代码完成前文件,并查看文件输出由可能做一个尾-f LOGFILE.LOG提前

感谢

+0

@AlexThornton了'打印( “Python是好.Iteration”,J),因为他的重定向'将写入该文件的''发射试验()':) – Torxed

回答

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秒:)

+0

Torxed喜sys.stdout'之前, 我一直在寻找能够在写入数据时看到数据的输出,而不是在程序结束时看到的东西。我已经尝试过flush(),但似乎我们只能在程序结束时看到文件上的数据? –

+0

@paarthbatra在每个'print(...)'执行'sys.stdout.flush()':) – Torxed

+0

@Alex Thornton sys.stdout.flush()作为预期的问题是我在窗口中使用它,不能看到尾巴就像输出一样。在linux尾巴上工作。 感谢您的答案,但我正在寻找一个Qt TextEdit作为这个数据的标准输出,并保持它作为buffereing,我的意思是显示数据没有延迟。谢谢:) –

1

对于每一次迭代,您必须添加此项。

sys.stdout.flush() 

这会刷新输出缓冲区,并执行打开和关闭文件的等效操作,以便修改被附加。

但是,我没有看到它在最后附加所有数据时出了什么问题,因为仍然会得到相同的结果,并且无论如何您都无法在外部访问该文件。

+0

我很伤心。另外,“有什么问题”是数据可能会丢失,具体取决于进程如何死亡以及文件系统如何处理它。 'flush()'与打开/关闭文件句柄无关。仅供参考。但我假设你指的是它将输出数据到文件的事实,就像你手动关闭它一样?那么这是因为'close()'刷新,如此接近是flush的平等而不是其他方式:) – Torxed

+0

这是我的问题,好像如何访问文件,而程序仍然在外部写入它,因为我们在Linux ,尾巴-f。 –

0

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

1

一个简单的解决方案是为python命令添加一个-u选项来强制unbuffered stdin,stdout和stderr。

python -u myscript.py