在Python的sys.stdout解释器中默认启用输出缓冲吗?

如果答案是肯定的,那么有哪些方法可以禁用它?

目前的建议:

使用-u命令行开关 包装系统。每次写入后刷新的对象中的标准输出 设置PYTHONUNBUFFERED env变量 sys。Stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

是否有其他方法在sys/sys中设置全局标志。在执行期间以编程方式Stdout ?


如果只是想在使用打印的特定写入之后刷新,请参阅如何刷新打印函数的输出?。


当前回答

以下代码适用于Python 2.6、2.7和3.2:

import os
import sys
buf_arg = 0
if sys.version_info[0] == 3:
    os.environ['PYTHONUNBUFFERED'] = '1'
    buf_arg = 1
sys.stdout = os.fdopen(sys.stdout.fileno(), 'a+', buf_arg)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'a+', buf_arg)

其他回答

这与Cristóvão D. Sousa的回答有关,但我还不能评论。

使用Python 3的flush关键字参数以始终拥有未缓冲输出的直接方法是:

import functools
print = functools.partial(print, flush=True)

然后,print将始终直接刷新输出(除非flush=False给出)。

注意,(a)这只回答了部分问题,因为它没有重定向所有输出。但我猜打印是在python中创建输出到stdout/stderr的最常用方法,所以这两行可能涵盖了大多数用例。

注意(b)它只在定义它的模块/脚本中工作。这在编写模块时很好,因为它不会混淆sys.stdout。

Python 2不提供flush参数,但您可以模拟Python 3类型的打印函数,如此处所述https://stackoverflow.com/a/27991478/3734258。

以下代码适用于Python 2.6、2.7和3.2:

import os
import sys
buf_arg = 0
if sys.version_info[0] == 3:
    os.environ['PYTHONUNBUFFERED'] = '1'
    buf_arg = 1
sys.stdout = os.fdopen(sys.stdout.fileno(), 'a+', buf_arg)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'a+', buf_arg)

我宁愿把我的答案放在如何刷新打印功能的输出?或者在Python的print函数中,当它被调用时,会刷新缓冲区?,但由于它们被标记为这一个的副本(我不同意),我将在这里回答它。

从Python 3.3开始,print()支持关键字参数"flush"(参见文档):

print('Hello World!', flush=True)

来自Magnus Lycka在邮件列表上的回答:

You can skip buffering for a whole python process using python -u or by setting the environment variable PYTHONUNBUFFERED. You could also replace sys.stdout with some other stream like wrapper which does a flush after every call. class Unbuffered(object): def __init__(self, stream): self.stream = stream def write(self, data): self.stream.write(data) self.stream.flush() def writelines(self, datas): self.stream.writelines(datas) self.stream.flush() def __getattr__(self, attr): return getattr(self.stream, attr) import sys sys.stdout = Unbuffered(sys.stdout) print 'Hello'

是的,它是。

您可以在命令行上使用“-u”开关禁用它。

或者,您可以在sys. flush()上调用。每次写入时的Stdout(或使用自动执行此操作的对象将其包装)