Skip to main content
 首页 » 编程设计

python之Sys.stdout.write 未按预期工作

2025年05月04日11youxin

我有一个循环访问两个字符串数组的测试脚本,我想使用 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 不断更新,同时打印语句通知用户一些操作。但是当我运行它时,唯一一次显示 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在 sleep 之后;接下来要做的就是用下一个 print 语句替换该行。 在 sleep 前写下消息:

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)