如何强制Python的print函数将缓冲输出刷新到屏幕?
另请参阅:如果目标是更改缓冲行为,则禁用输出缓冲。这个问题是关于在特定打印调用后显式刷新输出,即使输出仍在缓冲。
对于重复的闭包:如果初学者问了一个问题,试图在结尾处不使用换行符的情况下立即显示输出,请改用“当结尾处没有换行符时,为什么打印输出不立即显示在终端中?”?结束问题。目前的问题还不够好,因为提问者可能没有缓冲或冲洗的概念;另一个问题旨在首先解释这些概念,而这个问题是关于技术细节的。
如何强制Python的print函数将缓冲输出刷新到屏幕?
另请参阅:如果目标是更改缓冲行为,则禁用输出缓冲。这个问题是关于在特定打印调用后显式刷新输出,即使输出仍在缓冲。
对于重复的闭包:如果初学者问了一个问题,试图在结尾处不使用换行符的情况下立即显示输出,请改用“当结尾处没有换行符时,为什么打印输出不立即显示在终端中?”?结束问题。目前的问题还不够好,因为提问者可能没有缓冲或冲洗的概念;另一个问题旨在首先解释这些概念,而这个问题是关于技术细节的。
当前回答
运行python-h,我看到一个命令行选项:
-u:无缓冲的二进制stdout和stderr;同样,PYTHONUBUFFERED=x有关“-u”的内部缓冲的详细信息,请参阅手册页
这是相关文档。
其他回答
在Python 3.x中,print()函数得到了扩展:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
所以,你可以这样做:
print("Visiting toilet", flush=True)
Python文档条目
在Python 3中,您可以使用默认设置为flush=True来覆盖打印函数
def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
__builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)
在Python 3中,print可以采用可选的flush参数:
print("Hello, World!", flush=True)
在Python 2中,调用print后,请执行以下操作:
import sys
sys.stdout.flush()
默认情况下,打印到sys.stdout(有关文件对象的详细信息,请参阅文档)。
使用-u命令行开关可以工作,但有点笨拙。这意味着如果用户在没有-u选项的情况下调用脚本,程序可能会出现错误行为。我通常使用自定义stdout,如下所示:
class flushfile:
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
import sys
sys.stdout = flushfile(sys.stdout)
…现在,所有打印调用(隐式使用sys.stdout)都将自动刷新。
这是我的版本,它也提供了writeline()和fileno():
class FlushFile(object):
def __init__(self, fd):
self.fd = fd
def write(self, x):
ret = self.fd.write(x)
self.fd.flush()
return ret
def writelines(self, lines):
ret = self.writelines(lines)
self.fd.flush()
return ret
def flush(self):
return self.fd.flush
def close(self):
return self.fd.close()
def fileno(self):
return self.fd.fileno()