Sys.stdout.write 未按预期工作
Sys.stdout.write not working as expected
我有一个循环访问两个字符串数组的测试脚本,我想使用 sys.stdout.write
为用户提供一个简单的 'progress bar'。
我当前的脚本:
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
不断更新,同时打印语句通知用户一些操作。但是当我 运行 这个时,唯一一次显示 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
如何在更新时让剩余进度显示在所有打印件下方?
您需要刷新缓冲区;所有输出都被缓冲;保存在内存中,直到收集到一定数量的数据,以提高写入性能。
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)
我有一个循环访问两个字符串数组的测试脚本,我想使用 sys.stdout.write
为用户提供一个简单的 'progress bar'。
我当前的脚本:
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
不断更新,同时打印语句通知用户一些操作。但是当我 运行 这个时,唯一一次显示 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
如何在更新时让剩余进度显示在所有打印件下方?
您需要刷新缓冲区;所有输出都被缓冲;保存在内存中,直到收集到一定数量的数据,以提高写入性能。
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)