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

Luk*_*mer 1 python stdout sys python-2.7

我有一个迭代两个字符串数组的测试脚本,我想用它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)))
Run Code Online (Sandbox Code Playgroud)

预期输出用于sys.stdout.write保持更新,而打印语句通知用户某些动作.但是当我运行它时,唯一的时间sys.stdout.write显示在脚本的末尾.例如

 [*] stop if running Serv1
 [!] Passing over Serv2
 [*] stop if running Serv3
 [*] stop if running Serv4
 [!] Passing over Serv5
 [ ] 5/5 progress left
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 8

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

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

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

接下来,你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)
Run Code Online (Sandbox Code Playgroud)