水平打印命令行进度条

时间:2016-05-04 06:29:39

标签: python-2.7 console-output

#!/usr/bin/python
import time

count  = 5
temp = True
while temp:
        if count < 1:
                print "done",
                temp = False
        else:
                print "*"
                time.sleep(2)
                count -= 1

输出:

*
*
*
*
*
done

请注意,输出中的“*”在屏幕上以2秒的间隔一个接一个地打印(这正是我想要的),我需要将其用作其他代码中的进度条。

  1. 我使用print "*", 但是输出是水平的,但是在程序执行后它会立即打印出来。

    >>>* * * * * done
    
  2. 使用end关键字会出现此错误。

    File "progress_1_.py", line 11
     print ("*",end = '')
                        ^
    SyntaxError: invalid syntax
    
  3. Python版本是Python 2.7.5。

    我无法在此prod机器上升级Python,需要处理现有版本才能获得所需的输出。

    因此,考虑到上述情况,不是以新行打印,而是以2秒的间隔一个接一个地水平打印?

3 个答案:

答案 0 :(得分:3)

这是一个简单的答案:

#!/usr/bin/python

import sys
import time

def wait(n):
    time_counter = 0
    while True:
        time_counter += 1
        if time_counter <= n:
            time.sleep(1)
            sys.stdout.write("*")
            sys.stdout.flush()
        else:
            break
    sys.stdout.write("\n")
wait(10)

Output:

**********

您可以修改自己想要的方式。

答案 1 :(得分:2)

Python 2的print语句不如Python 3中的函数灵活。

如果你使用Python 3,你可以简单地指定结束字符以及是否立即刷新缓冲区,如下所示:

print("*", end="", flush=True)

但是,当您使用Python 2时,您不能使用print语句,但必须直接访问输出流对象:

import sys
def progress_print(character="*"):
     sys.stdout.write(character)
     sys.stdout.flush()

这会强制Python在一行完成之前不缓存打印数据,但会通过刷新缓冲区立即显示它。

答案 2 :(得分:2)

您可以使用python -u

跳过整个python进程的缓冲

或者当您需要使用python 2时,您也可以将sys.stdout替换为其他流,例如在每次调用后都执行刷新的包装器。

class Unbuffered(object):
   def __init__(self, stream):
       self.stream = stream
   def write(self, data):
       self.stream.write(data)
       self.stream.flush()
   def __getattr__(self, attr):
       return getattr(self.stream, attr)

import time
import sys
sys.stdout = Unbuffered(sys.stdout)
print '*',
time.sleep(2)
print '*'