50

print()该函数有一个布尔可选参数flush,默认为 False。

文档说这是强制刷新流。

我不明白冲洗的概念。什么是冲洗这里?什么是流的冲洗?

4

3 回答 3

36

通常输出到文件或控制台是缓冲的,至少在您打印换行符之前输出文本。刷新确保缓冲的任何输出都到达目的地。

我确实使用它,例如,当我Do you want to continue (Y/n):在获取输入之前发出用户提示时,例如。

这可以模拟(在 Ubuntu 12.4 上使用 Python 2.7):

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)

如果你运行这个,你会看到提示字符串直到睡眠结束并且程序退出时才会出现。如果用flush取消注释该行,您将看到提示,然后必须等待5秒钟才能完成程序

于 2013-03-25T05:30:34.683 回答
34

这里有几件事要理解。一是缓冲 I/O 和非缓冲 I/O 之间的区别。这个概念相当简单——对于缓冲 I/O,有一个内部缓冲区被保留。仅当该缓冲区已满(或发生其他事件,例如到达换行符)时,输出才会“刷新”。使用无缓冲 I/O,每当调用输出某些内容时,它都会执行此操作,一次 1 个字符。

大多数 I/O 函数都属于缓冲类别,主要是出于性能原因:一次写入块要快得多(所有 I/O 函数最终都归结为某种描述的系统调用,这很昂贵。)

flush允许您手动选择何时写入此内部缓冲区 - 调用 flush 将在缓冲区中写入任何字符。通常,这不是必需的,因为流将自行处理。但是,在某些情况下,您可能希望在继续之前确保输出某些内容 - 这是您需要调用flush().

于 2013-03-25T05:37:45.897 回答
4

我们在这里有两个完美的答案,

Anthon说得很清楚,基本上,在下一行完成之前,从技术上讲,打印线不会运行(打印) 。

从技术上讲,该行确实运行它只是保持无缓冲,直到下一行完成运行。

sleep对于某些在运行函数后使用该函数的人来说,这可能会导致一个错误,他们希望在函数启动print之前看到它的打印。sleep

那么我为什么要添加另一个答案?

未来已经到来,我想花时间更新你:

from __future__ import print_function

首先,我认为这是一个内部笑话,意在显示错误:未定义未来^_^


我现在正在查看PyCharm 的文档,看起来他们在 print 函数本身中添加了一个内置的刷新方法,看看这个:

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)

正如安东所说:

如果你运行这个,你会看到提示字符串直到睡眠结束并且程序退出时才会出现。如果用flush取消注释该行,您将看到提示,然后必须等待5秒钟才能完成程序

因此,让我们将其转换为我们当前的情况:

如果运行此程序,您将看到提示,然后必须等待 5 秒才能完成flush=False程序退出。

于 2020-12-09T06:53:58.633 回答