2016-12-19 7 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...

それが終了すると、それはこのことで)同じ行に(をを交換する必要があります10

>> ✓ Subcase decryption table loaded.

これは機能しません。それはそうのようなループにあった場合は代わりに、最初のprint文が同様'\r'print('\r ⦾ Loading subcase decryption table...', end='')のようにリターン文字で開始することが、私はちょうどその理由を理解していません。..

持ってこれは完璧な理にかなって:

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

誰かがこれを私に説明できますか?

+0

私は通常、 'print( 'whatever'、end = '\ r')'を実行するので、文字列がきれいできれいに見えます。 –

+0

対話シェルでこれを実行していますか?スクリプトを外部から実行すると機能しますか? –

+0

@AndrasDeakこれは標準のPyCharm出力シェルです。外部的には、たとえばcmdや別のスクリプトから呼び出すことですか? –

答えて

2

理由は(おそらく)シェルがline bufferedであることが考えられます。送信されたテキストは、特定の長さまで、または\rが出現するまでバッファリングされます。その理由は、プログラムが単一の文字を書き出す場合にオーバーヘッドを最小限に抑えることであり、レンダリングの内容を最新のユーザーに便利な瞬間に延期するからです。

インタラクティブデバイス用のラインバッファリングの使用は改行で終わる出力 のメッセージが表示されることを意味し、すぐに、その何をしたい通常 です。改行で終わらない出力がまたは がすぐに表示しない場合があります、あなたがそれらをすぐに表示したいので、もし、あなたが にfflushで明示的にバッファリングされた出力をフラッシュする必要があります

ラインバッファリングは、なぜあなたの最初の行になることはありません表示されます。行の先頭に\rを付けると、効果的に行バッファーがフラッシュされます。

解決方法は、通常、下にあるストリームに直接書き込むか、バッファを強制的にフラッシュすることです。

関連する問題