2013-01-13 72 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)