【问题标题】:Sys.stdout.write not working as expectedSys.stdout.write 没有按预期工作
【发布时间】:2015-04-23 10:39:39
【问题描述】:

我有一个迭代两个字符串数组的测试脚本,我想使用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

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

【问题讨论】:

  • 那些是每行的,默认情况下你不能回去写上一行。一种方法是清除屏幕并一次又一次地写入所有行或一些Windows api。 stackoverflow.com/questions/7122775/…
  • 我有另一个脚本可以扫描任何主机 ip 地址上的端口,它成功打印并同时提供进度输出。我直接从中复制了部分,但在这个示例中似乎不起作用。

标签: python python-2.7 stdout sys


【解决方案1】:

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

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.flush(),但似乎没有任何区别?
  • @LukeWillmer:对,您正在立即在顶部打印下一条消息。移动sleep() 呼叫。
  • 啊,是的,看来我需要sys.stdout.flush() 以及要移动的睡眠呼叫。谢谢!
  • @LukeWillmer:是的,flush 绝对是一个要求,我只是想念你把sys.stdout.write() 放在你永远不会注意到它做了什么的地方。 :-)
猜你喜欢
  • 2021-10-19
  • 2020-03-18
  • 2012-06-14
  • 2014-11-15
  • 1970-01-01
  • 2012-07-02
  • 2011-09-07
  • 2013-03-03
  • 2015-05-18
相关资源
最近更新 更多