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)
如何更新时,如何在所有打印件下方显示进度?
你需要刷新缓冲区; 所有输出都被缓冲; 保留在内存中,直到收集到一定数量的数据,以提高写入性能.
该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)