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

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

目前的建议:

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

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


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


当前回答

你也可以使用stdbuf实用程序运行Python:

stdbuf -oL蟒蛇<脚本>

其他回答

是的,默认启用。当调用python时,可以在命令行上使用-u选项禁用它。

是的,它是。

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

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

重写sys的只写方法是可能的。带有一个调用flush的Stdout。建议的方法实现如下所示。

def write_flush(args, w=stdout.write):
    w(args)
    stdout.flush()

w参数的默认值将保留原来的写入方法引用。定义了write_flush之后,可能会覆盖原来的写操作。

stdout.write = write_flush

代码假设stdout是从sys import stdout以这种方式导入的。

您还可以使用fcntl动态更改文件标志。

fl = fcntl.fcntl(fd.fileno(), fcntl.F_GETFL)
fl |= os.O_SYNC # or os.O_DSYNC (if you don't care the file timestamp updates)
fcntl.fcntl(fd.fileno(), fcntl.F_SETFL, fl)
# reopen stdout file descriptor with write mode
# and 0 as the buffer size (unbuffered)
import io, os, sys
try:
    # Python 3, open as binary, then wrap in a TextIOWrapper with write-through.
    sys.stdout = io.TextIOWrapper(open(sys.stdout.fileno(), 'wb', 0), write_through=True)
    # If flushing on newlines is sufficient, as of 3.7 you can instead just call:
    # sys.stdout.reconfigure(line_buffering=True)
except TypeError:
    # Python 2
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

工作人员:“塞巴斯蒂安”,在Python邮件列表的某个地方。