2014-10-09 49 views
6

实时打印语句我有一个Python脚本,看起来像这样:利用发球得到蟒蛇

$ python my.py | tee my_file.txt 

但是:

for item in collection: 
    print "what up" 
    #do complicated stuff that takes a long time. 

在bash,我通过执行以下操作运行该脚本,所有我在bash中看到的都是空白的行,直到程序结束。然后,所有的打印声明都集中在一起。

这是三通的预期操作吗?我可以使用T恤实时查看输出吗?

+0

这将是与Python的问题。这是故意的。它只是检测到输出不会到达终端,所以它是缓冲。你需要关闭缓冲。如何做到这一点可能更适合stackexchange.com – Patrick 2014-10-09 02:22:20

+1

可能是这样的帮助:http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe – Ketan 2014-10-09 02:26:25

+1

顶部做“'进口系统''并在打印语句下面的缩进行中做''sys.stdout.flush()'“ – Anthon 2014-10-09 04:20:52

回答

15

与许多程序一样,Python会尽量减少调用write系统调用的次数。它通过在实际将它们写入其标准输出文件之前收集几个print语句的输出来完成此操作。这个过程被称为缓冲输出。

当Python连接到终端时,它不会缓冲其输出。这是有道理的,因为终端的人员想要马上看到输出。

当Python写入文件(或管道)时,它会缓存其输出。这也是有道理的,因为在这个过程完成之前,没有人会看到输出

无论何时您想强制Python将其缓冲输出写入其标准输出文件,您都可以通过调用sys.stdout.flush()来击败此优化。

在你的情况,试试这个:

import sys 
... 
for item in collection: 
    print "what up" 
    sys.stdout.flush() 
    #do complicated stuff that takes a long time. 
+0

很好的解释!我会补充说,调用标有'-u'的脚本也可以解决你的问题,例如'python -u my.py | tee my_file.txt' – BiBi 2018-01-27 18:57:19