2013-01-13 36 views
8

我要动态地更新一些信息(就像进度条),我可以用下面的代码如何刷新多行输出动态

#! /usr/bin/env python 
import sys 
import time 

print "start the output" 
def loop(): 
    i = 0 

    while 1: 
     i += 1 
     output = "\rFirst_line%s..." % str(i) 
     sys.stdout.write(output)   
     sys.stdout.flush() 
     time.sleep(1) 
loop() 

它只能输出SINGLE_LINE信息动态,加当做到这一点'\ n'输出,它不能按预期工作。

output = "\rFirst_line%s...\n" % str(i) 

任何方式可以帮助它刷新multi_line内容?

回答

-1

写“\ B”与控制台:

import sys 
import time 

print "start the output" 
def loop(): 
    i = 0 
    output = "\rFirst_line%s..." % str(0) 
    sys.stdout.write(output) 
    while 1: 
     sys.stdout.write('\b'*len(output)) 
     i += 1 
     output = "\rFirst_line%s..." % str(i) 
     sys.stdout.write(output)   
     sys.stdout.flush() 
     time.sleep(1) 
loop() 
+0

嗨,imxylz。感谢您的快速响应,但是如果输出中有'\ n',它仍然不能正常工作,如output =“\ rFirst_line%s ... \ n +++”%str(i)。 – user1675167

+0

虽然tt可能看起来合理,但您不能用新行回写(退格),但以前不会与teletypes向后兼容。如果你想清除所有的屏幕,请检查这一点。 http://stackoverflow.com/questions/3136202/deleting-already-printed-in-python#3136352 – imxylz

+0

我尝试新的函数print(object1,object2,sep ='\ n',end =''),跟着sys.stdout.write('\ b \ b \ b/b \'),'\ b'对'\ n'字符串仍然不能正常工作。看来,我必须改变我的方式(使用os.system('clear')。再次感谢 – user1675167

0

有没有办法做到这一点的系统独立(说时,“系统”我的意思不只是操作系统,但也终端应用以及其作为建立好吧),因为没有标准的转义序列会将光标向上移动。至于与系统相关的方式,它们可能适用于您的配置,但需要更多关于您的系统的信息。无论如何,通常使用这些功能并不是一个好主意。

P.S.希望你不会将你的程序输出重定向到一个文件。如果重定向到文件,这些进度指示器会产生可怕的输出。

1

你可以用curses做到这一点,但它并不重要。

2

我也有过这种情况,我终于得到了一个主意来解决这个; d

reprint- A simple module for Python 2/3 to print and refresh multi line output contents in terminal

你可以简单地把该output实例作为正常dictlist(取决于你使用哪种模式)。当您修改output实例内容,在终端输出将自动刷新:d

这里有一个例子:

from reprint import output 
import time 
import random 

print "start the output" 

with output(initial_len=3, interval=0) as output_lines: 
    while True: 
     output_lines[0] = "First_line {}...".format(random.randint(1,10)) 
     output_lines[1] = "Second_line {}...".format(random.randint(1,10)) 
     output_lines[2] = "Third_line {}...".format(random.randint(1,10)) 
     time.sleep(0.5)