gpt4 book ai didi

Python:contextlib.redirect_stdout 有时不能实时工作

转载 作者:太空宇宙 更新时间:2023-11-04 00:30:03 24 4
gpt4 key购买 nike

我在 Ubuntu 上使用 Python3.5。以下脚本创建一个文件 out 并用越来越多的“Hello”行填充它:

import contextlib
with contextlib.redirect_stdout(open('out','w')):
while True:
print('Hello')

但是,如果我通过添加对 time.sleep() 的调用进行微小的修改,文件 out 将保持为空:

import contextlib
import time
with contextlib.redirect_stdout(open('out','w')):
while True:
print('Hello')
time.sleep(1)

如果我通过将循环变成有限循环来进一步更改代码,它会填充out,但只会在循环结束时以 block 形式填充。

谁能重现并解释一下?

最佳答案

这是由输出缓冲引起的。这是一个使用 contextlib 的有趣案例,但根本问题在于 open('out', 'w') 语句。

要防止输出缓冲,您可以设置 buffering argument如果您使用的是 Python 2,则为 0:

import contextlib
import time

with contextlib.redirect_stdout(open('out','w', 0)):
while True:
print 'Hello'
time.sleep(1)

或者,一旦上下文管理器关闭文件(或一旦缓冲内容超过一定大小),文件内容将被写入。

如果您使用的是 Python 3,则不能使用无缓冲的文本 I/O(请在评论中指出)。但是,在每个循环结束时刷新 stdout 应该会产生预期的效果:

import contextlib
import time
import sys

with contextlib.redirect_stdout(open('out','w')):
while True:
print('Hello')
sys.stdout.flush()
time.sleep(1)

关于Python:contextlib.redirect_stdout 有时不能实时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46171204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com