- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 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/
自从我知道了这个模式,我就一直在使用 with open('myfile.txt','w') as myfile: with contextlib.redirect_stdout(myfile
我在 Ubuntu 上使用 Python3.5。以下脚本创建一个文件 out 并用越来越多的“Hello”行填充它: import contextlib with contextlib.redirec
我使用 Python2.7 并且我想要函数:contextlib.redirect_stdout . 我的意思是,我想重定向特定函数的输出(不是所有程序)。 问题是 - 只有 Python3 支持“c
documentation为 redirect_stdout在我目前使用的 1.1.0 版本上,似乎没有给出如何使用该功能的示例。也许我错过了? 我想捕获 println 的输出并将其作为字符串取回。
我是一名优秀的程序员,十分优秀!