Sys.stdout.write没有按预期工作

时间:2015-04-23 10:39:39

标签: python python-2.7 stdout sys

我有一个迭代两个字符串数组的测试脚本,我想使用sys.stdout.write为用户提供一个简单的“进度条”。

我目前的剧本:

import sys
from time import sleep
names  = ['Serv1', 'Serv2', 'Serv3', 'Serv4', 'Serv5']
states = ['Running', 'Stopped', 'Running', 'Running', 'Stopped']
terminated=0
passed=0
for i in range (0, len(names)):
    if 'Running' in states[i]:
        print " [*] stop if running {0} ".format(str(names[i]))
        #service_info(action, machine, names[i])
        terminated+=1
    else:
        print " [!] Passing over {0} ".format(str(names[i]))
        passed+=1
    sleep(2)
    sys.stdout.write(" [ ] {0}/{1} progress left\r".format(i+1, len(names)))

预期输出是sys.stdout.write继续更新,而print语句通知用户某些操作。但是当我运行它时,显示的唯一时间sys.stdout.write位于脚本的末尾。 E.g。

 [*] stop if running Serv1
 [!] Passing over Serv2
 [*] stop if running Serv3
 [*] stop if running Serv4
 [!] Passing over Serv5
 [ ] 5/5 progress left

如何在更新时将所有打印件显示在下方?

1 个答案:

答案 0 :(得分:7)

你需要冲洗缓冲区;所有输出都被缓冲;保留在内存中,直到收集到一定数量的数据,以提高写入性能。

print语句为您刷新缓冲区,但直接写入stdout时,您需要明确刷新:

sys.stdout.write(" [ ] {0}/{1} progress left\r".format(i+1, len(names)))
sys.stdout.flush()

接下来,您在睡觉后写信给stdout ;接下来你要做的就是用下一个print语句替换该行。在睡觉之前写下消息:

for i in range (0, len(names)):
    if 'Running' in states[i]:
        print " [*] stop if running {0} ".format(str(names[i]))
        #service_info(action, machine, names[i])
        terminated+=1
    else:
        print " [!] Passing over {0} ".format(str(names[i]))
        passed+=1
    sys.stdout.write(" [ ] {0}/{1} progress left\r".format(i+1, len(names)))
    sys.stdout.flush()
    sleep(2)