在Python的sys.stdout解释器中默认启用输出缓冲吗?
如果答案是肯定的,那么有哪些方法可以禁用它?
目前的建议:
使用-u命令行开关
包装系统。每次写入后刷新的对象中的标准输出
设置PYTHONUNBUFFERED env变量
sys。Stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
是否有其他方法在sys/sys中设置全局标志。在执行期间以编程方式Stdout ?
如果只是想在使用打印的特定写入之后刷新,请参阅如何刷新打印函数的输出?。
# 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邮件列表的某个地方。
def disable_stdout_buffering():
# Appending to gc.garbage is a way to stop an object from being
# destroyed. If the old sys.stdout is ever collected, it will
# close() stdout, which is not good.
gc.garbage.append(sys.stdout)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
# Then this will give output in the correct order:
disable_stdout_buffering()
print "hello"
subprocess.call(["echo", "bye"])
不拯救旧的系统。Stdout, disable_stdout_buffering()不是幂等的,多次调用将导致这样的错误:
Traceback (most recent call last):
File "test/buffering.py", line 17, in <module>
print "hello"
IOError: [Errno 9] Bad file descriptor
close failed: [Errno 9] Bad file descriptor
另一种可能性是:
def disable_stdout_buffering():
fileno = sys.stdout.fileno()
temp_fd = os.dup(fileno)
sys.stdout.close()
os.dup2(temp_fd, fileno)
os.close(temp_fd)
sys.stdout = os.fdopen(fileno, "w", 0)
(附加到gc。垃圾并不是一个好主意,因为它是放置不可释放循环的地方,您可能需要检查它们。)