50

print()関数にはブールオプションの引数があり、flushデフォルトはFalseです。

ドキュメントには、ストリームを強制的にフラッシュすることが記載されています。

フラッシングの概念がわかりません。ここでフラッシングとは何ですか?ストリームのフラッシングとは何ですか?

4

3 に答える 3

36

通常、ファイルまたはコンソールへの出力はバッファリングされ、少なくとも改行を出力するまでテキストが出力されます。フラッシュにより、バッファリングされたすべての出力が宛先に送られるようになります。

Do you want to continue (Y/n):たとえば、入力を取得する前に、のようなユーザープロンプトを作成するときに使用します。

これはシミュレートできます(Python2.7を使用するUbuntu12.4で):

from __future__ import print_function

import sys
from time import sleep

fp = sys.stdout
print('Do you want to continue (Y/n): ', end='')
# fp.flush()
sleep(5)

これを実行すると、スリープが終了してプログラムが終了するまでプロンプト文字列が表示されないことがわかります。フラッシュを使用して行のコメントを解除すると、プロンプトが表示され、プログラムが終了するまで5秒間待つ必要があります。

于 2013-03-25T05:30:34.683 に答える
34

ここで理解すべきことがいくつかあります。1つは、バッファ付きI/OとバッファなしI/Oの違いです。概念はかなり単純です-バッファリングされたI/Oの場合、保持される内部バッファがあります。そのバッファがいっぱいになったとき(または改行に到達するなど、他のイベントが発生したとき)にのみ、出力が「フラッシュ」されます。バッファなしI/Oを使用すると、何かを出力するために呼び出しが行われるたびに、一度に1文字ずつこれが実行されます。

ほとんどのI/O関数は、主にパフォーマンス上の理由から、バッファリングされたカテゴリに分類されます。一度にチャンクを書き込む方がはるかに高速です(すべてのI / O関数は、最終的にはコストのかかる何らかの説明のシステムコールになります)。

flushこの内部バッファをいつ書き込むかを手動で選択できます。flushを呼び出すと、バッファ内の任意の文字が書き込まれます。ストリームがこれ自体を処理するため、通常、これは必要ありません。ただし、続行する前に何かが出力されていることを確認したい場合があります。これは、への呼び出しを使用する場所ですflush()

于 2013-03-25T05:37:45.897 に答える
4

ここにある2つの完璧な答え、

Anthonは、基本的に、次の行が終了するまで印刷行は技術的に実行(印刷)されないことを非常に明確に理解しました。

技術的には、行は実行されますが、次の行の実行が終了するまでバッファリングされないままになります。

sleepこれにより、関数を実行した後に関数を使用し、関数が開始printする前に関数が出力されることを期待している人にとっては、バグが発生する可能性がありsleepます。

では、なぜ私は別の答えを追加するのですか?

未来が到来したので、時間をかけて更新したいと思います。

from __future__ import print_function

まず第一に、これはエラーを示すことを意図した内輪ネタだったと思います。未来は定義されていません^ _ ^


私は今PyCharmのドキュメントを見ています、そして彼らがprint関数自体の中に構築されたflushメソッドを追加したようです、これを見てください:

def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
"""
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file:  a file-like object (stream); defaults to the current sys.stdout.
sep:   string inserted between values, default a space.
end:   string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
"""
pass

ここに画像の説明を入力してください


したがって、次を使用できる可能性があります:(パラメーターの使用順序が同じであるかどうかはわかりません)

from __present__ import print_function

from time import sleep

print('Hello World', flush=True)

sleep(5)

またはこれ:

print('Hello World', file=sys.stdout , flush=True)

アンソンが言ったように:

これを実行すると、スリープが終了してプログラムが終了するまでプロンプト文字列が表示されないことがわかります。フラッシュを使用して行のコメントを解除すると、プロンプトが表示され、プログラムが終了するまで5秒間待つ必要があります。

それでは、それを現在の状況に変換してみましょう。

これを実行すると、プロンプトが表示され、プログラムが終了するまで5秒待つ必要があります。flushを使用して行をに変更するflush=Falseと、スリープが終了してプログラムが終了するまでプロンプト文字列が表示されないことがわかります。終了します。

于 2020-12-09T06:53:58.633 に答える