print()的`flush`做什么?

时间:2013-03-25 05:27:09

标签: python python-3.x

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

文档说它是强制刷新流。

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

3 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:10)

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

我确实使用它,例如当我在获得输入之前创建类似Do you want to continue (Y/n):的用户提示时。

这可以模拟(在使用Python 2.7的Ubuntu 12.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)

如果运行此命令,您将看到在睡眠结束并退出程序之前,提示字符串不会显示。如果您使用flush取消注释该行,您将看到提示,然后必须等待5秒才能完成该程序

答案 2 :(得分:0)

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

Anthon 非常清楚地理解,基本上,从技术上讲,直到下一行完成时,打印行才运行(print)

从技术上讲,这条线确实在运行,直到缓冲 下一行已完成运行。

对于运行sleep函数并希望在print函数启动之前可以看到其打印功能的某些人来说,这可能会导致错误。

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

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

sleep

首先,我相信这是一个内在玩笑,旨在显示一个错误:未来未定义^ _ ^


我现在正在查看 PyCharm的文档,看起来他们添加了内置在print函数自身内部的flush方法,看看这个:

from __future__ import print_function

enter image description here


因此我们也许可以使用:(不确定参数的使用顺序是否应该相同)

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)

正如Anthon所说:

如果运行此命令,将看到提示字符串未显示 直到睡眠结束并且程序退出。如果您取消注释该行 刷新,您将看到提示,然后必须等待5秒钟 程序完成

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

如果运行此命令,则会看到提示,然后必须等待5秒钟 为程序完成,如果您更改行 刷新到print('Hello World', file=sys.stdout , flush=True) 后,您将看到提示字符串未显示 直到睡眠结束并且程序退出。