2016-12-19 15 views
0

不工作的我的代碼snipet是這樣的:打印在同一行(覆蓋)如預期

print(' ⦾ Loading subcase decryption table...', end='') 
codes_dict = load_codes(codes_file) 
print('\r ✓ Subcase decryption table loaded.') 

的這樣做的目的是已顯示爲一些正在運行的反饋消息(和什麼),像這樣:

>> ⦾ Loading subcase decryption table...

一旦完成,它必須是更換(在同一行)本:

>> ✓ Subcase decryption table loaded.

雖然這不起作用。相反,第一個打印語句開始與回車符以及'\r'print('\r ⦾ Loading subcase decryption table...', end=''),但我就是不明白,爲什麼..

它將使完美的意義,如果它是在像這樣一個循環:

for i in range(76): 
    print('\r {:7.2%}'.format((i + 1)/76), end='') 

有人可以向我解釋這一點嗎?

+0

我通常會打印('whatever',end ='\ r')'所以我的字符串看起來不錯和乾淨 –

+0

你在交互式shell中運行這個嗎?如果你在外部運行腳本,它會工作嗎? –

+0

@AndrasDeak它只是標準的PyCharm輸出外殼。從外部來說,你的意思是從cmd或其他腳本調用它,例如? –

回答

2

原因(很可能是)你的shell是line buffered。發送給它的任何文本都被緩存到一定的長度,或者直到遇到\r。這樣做的原因是如果程序寫出單個字符,將渲染內容推遲到最新但用戶便利的時刻,則將開銷最小化。

使用行緩衝的交互設備意味着輸出 消息以換行符結尾會出現立即,這通常是 你想要什麼。輸出不換行最終可能會或可能不會 馬上顯示出來,所以如果你希望他們立即出現,你應該 刷新緩衝輸出明確地fflush

線緩衝就是你的第一個從來沒有行出現;如果在行的前面添加\r,則可以有效地清空行緩衝區。

解決方案通常是直接寫入底層流或強制緩衝區刷新。