基本的に次のような出力を表示するスクリプトを実行したいと思います。
Installing XXX... [DONE]
現在、Installing XXX...
最初に印刷してからを印刷します[DONE]
。
ただし、同じ行に印刷Installing xxx...
したいと思い[DONE]
ます。
何か案は?
基本的に次のような出力を表示するスクリプトを実行したいと思います。
Installing XXX... [DONE]
現在、Installing XXX...
最初に印刷してからを印刷します[DONE]
。
ただし、同じ行に印刷Installing xxx...
したいと思い[DONE]
ます。
何か案は?
回答:
print
ステートメントを使用して、インポートせずにこれを行うことができますsys
。
def install_xxx():
print "Installing XXX... ",
install_xxx()
print "[DONE]"
print
行の終わりのコンマは、print
新しい行を発行しないようにします(出力の最後に余分なスペースがあることに注意してください)。
Python 3ソリューション
上記はPython 3では機能しないため、代わりにこれを行うことができます(ここでも、インポートせずにsys
):
def install_xxx():
print("Installing XXX... ", end="", flush=True)
install_xxx()
print("[DONE]")
print関数は、end
デフォルトのパラメータを受け入れます"\n"
。空の文字列に設定すると、行の最後に新しい行が発行されなくなります。
print("...", end="", flush=True)
Python 3で使用し、Python 2でsys.stdout.flush()
呼び出しを追加します。
print("Progress: {}%".format(var), end="\r", flush=True)
あなたは単にこれを使うことができます:
print 'something',
...
print ' else',
そして出力は
something else
でやり過ぎる必要はありませんimport sys
。最後のコンマ記号に注意してください。
print("some string", end="");
最後の改行挿入を削除するPython 3+。続きを読むhelp(print);
print
この関数は3 VSパイソン2にわずかに異なる構文を持つ
バックスペース ' \ r 'または( ' \ x08を使用する必要がありますコンソール出力の前の位置に戻るに ')文字をます
Python 2+:
import time
import sys
def backspace(n):
sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
sys.stdout.write(s) # just print
sys.stdout.flush() # needed for flush when using \x08
backspace(len(s)) # back n chars
time.sleep(0.2) # sleep for 200ms
Python 3:
import time
def backline():
print('\r', end='') # use '\r' to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print(s, end='') # just print and flush
backline() # back to the beginning of line
time.sleep(0.2) # sleep for 200ms
このコードは1行で0%から100%までカウントされます。最終的な値は次のとおりです。
> python test.py
100%
ここでのフラッシュに関する追加情報:'end ='引数を含むpython printステートメントの動作がwhileループで異なるのはなぜですか?
とを使用sys.stdout.write('Installing XXX... ')
しsys.stdout.write('Done')
ます。このように"\n"
、印刷機能を再作成する場合は、手動で新しい行を追加する必要があります。このためだけにcursesを使用する必要はないかもしれないと思います。
__future__
ます。インポートなどに依存する必要なく、python2.xとpython3.xでまったく同じように機能するためです。
新しい行が見つかるまですべてが一時停止していたため、どの回答もうまくいきませんでした。私は簡単なヘルパーを書きました:
def print_no_newline(string):
import sys
sys.stdout.write(string)
sys.stdout.flush()
テストするには:
import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')
「こんにちは」は、スリープする前に、最初に出力して画面にフラッシュします。その後、標準印刷を使用できます。
sys.stdout.write
改行なしで印刷されます
import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")
http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines
print('\r' + 'something to be override', end='')
これは、カーソルを最初に戻し、何かを印刷して同じ行で終了することを意味します。ループしている場合は、開始した場所と同じ場所で印刷を開始します。
print(’something to be override’, end=‘\r’)
はもっと簡単だと思います。
(継続的に追加するのではなく)前の行を上書きする場合は、printステートメントの最後で\r
と 組み合わせることができますprint(),
。例えば、
from time import sleep
for i in xrange(0, 10):
print("\r{0}".format(i)),
sleep(.5)
print("...DONE!")
コンソールの古い番号を置き換えて、0から9までカウントします。の"...DONE!"
最後のカウンター、9と同じ行に印刷されます。
OPの場合、これによりコンソールはインストールの完了率を「進行状況バー」として表示し、開始と終了の文字位置を定義し、その間のマーカーを更新できます。
print("Installing |XXXXXX | 30%"),
@ Vadim-Zin4ukによって3.0バージョンから派生した2.7互換バージョンを次に示します。
Python 2
import time
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print '{0}\r'.format(s), # just print and flush
time.sleep(0.2)
さらに言えば、提供されている3.0ソリューションは少し肥大化しています。たとえば、backspaceメソッドは整数引数を使用しないため、おそらく完全に取り除くことができます。
Python 3
import time
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print('{0}\r'.format(s), end='') # just print and flush
time.sleep(0.2) # sleep for 200ms
どちらもテスト済みで動作しています。
これは非常に古いスレッドですが、これは非常に完全な回答とサンプルコードです。
\r
ASCII文字セットからの復帰の文字列表現です。これは、進と同じだ015
[ chr(0o15)
]または16進0d
[ chr(0x0d)
]または小数13
[ chr(13)
]。man ascii
退屈な読み取りについては、を参照してください。それ(\r
)はかなりポータブルな表現であり、人々が読むのに十分簡単です。それは非常に単純に、紙を進めずにタイプライターのキャリッジを最初から最後まで動かすことを意味します。これは、キャリッジリターンとラインフィードを意味するCR
部分です。CRLF
print()
はPython 3の関数です。Python2(使用したい任意のバージョン)ではprint
、__future__
モジュールからその定義をインポートすることで、関数に強制できます。このprint
関数の利点は、最後に何を印刷するかを指定できること\n
で、すべてのprint()
呼び出しの最後に改行を印刷するというデフォルトの動作を上書きできます。
sys.stdout.flush
標準出力の出力をフラッシュするようにPythonに指示します。標準出力は、print()
特に指定しない限り、ここで出力を送信します。python -u
環境変数を使用して実行したりPYTHONUNBUFFERED=1
、環境変数を設定したりして、import sys
とのsys.stdout.flush()
呼び出しをスキップしても、同じ動作を得ることができます。これを行うことで得られる量はほぼ正確にゼロであり、アプリケーションが正しく動作する前にそのステップを実行する必要があることを忘れてしまうと、デバッグが非常に難しくなります。
そしてサンプル。これはPython 2または3で完全に実行されることに注意してください。
from __future__ import print_function
import sys
import time
ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}
for i in range(1, ANS + 1):
if i in FACTORS:
print('\r{0:d}'.format(i), end='')
sys.stdout.flush()
time.sleep(ANS / 100.0)
else:
print()
私はこの解決策を見つけました、そしてそれはPython 2.7で動作しています
# Working on Python 2.7 Linux
import time
import sys
def backspace(n):
print('\r', end='') # use '\r' to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
sys.stdout.write(string)
backspace(len(s)) # back for n chars
sys.stdout.flush()
time.sleep(0.2) # sleep for 200ms
print
はPython 2.7の不正な構文であり、コードは正しい構文でも機能しません。