Why print in Python doesn#39;t pause when using sleep in a loop?(为什么在循环中使用睡眠时 Python 中的打印不会暂停?)
问题描述
这段代码:
import time
for i in range(10):
print(i)
time.sleep(.5)
导致我的计算机挂起 5 秒,然后打印出 0-9,而不是每半秒打印一个数字.我做错了吗?
Causes my computer to hang for 5 seconds, and then print out 0-9, as opposed to printing a digit every half second. Am I doing something wrong?
推荐答案
print
默认打印到 sys.stdout
并在内部缓冲要打印的输出.
print
, by default, prints to sys.stdout
and that buffers the output to be printed, internally.
输出是否缓冲通常由文件决定,但如果flush
关键字参数为真,则流被强制刷新.
Whether output is buffered is usually determined by file, but if the
flush
keyword argument is true, the stream is forcibly flushed.
3.3 版更改:添加了 flush
关键字参数.
Changed in version 3.3: Added the flush
keyword argument.
引用 sys.stdout
的文档,
Quoting sys.stdout
's documentation,
交互时,标准流是行缓冲的.否则,它们会像常规文本文件一样被块缓冲.
When interactive, standard streams are line-buffered. Otherwise, they are block-buffered like regular text files.
因此,在您的情况下,您需要像这样显式刷新
So, in your case, you need to explicitly flush, like this
import time
for i in range(10):
print(i, flush=True)
time.sleep(.5)
好的,这个缓冲有很多混乱.让我尽可能解释.
Okay, there is a lot of confusion around this buffering. Let me explain as much as possible.
首先,如果您在终端中尝试此程序,它们会执行行缓冲(这基本上意味着,每当您遇到换行符时,将缓冲的数据发送到 stdout
),默认情况下.所以,你可以在 Python 2.7 中重现这个问题,像这样
First of all, if you are trying this program in a terminal, they do line buffering (which basically means, whenever you encounter a newline character, send the buffered data to stdout
), by default. So, you can reproduce this problem in Python 2.7, like this
>>> import time
>>> for i in range(10):
... print i,
... time.sleep(.5)
...
在 Python 3.x 中,
And in Python 3.x,
>>> for i in range(10):
... print(i, end='')
... time.sleep(.5)
我们通过 end=''
因为,默认的 end
值是
,根据 print
的文档,
We pass end=''
because, the default end
value is
, as per the print
's documentation,
print(*objects, sep=' ', end='
', file=sys.stdout, flush=False)
由于默认的end
打破了行缓冲,数据将立即发送到stdout
.
Since the default end
breaks the line buffering, the data will be sent to stdout
immediately.
重现此问题的另一种方法是将 OP 给出的实际程序存储在文件中并使用 Python 3.x 解释器执行,您将看到 stdout
在内部缓冲数据并等待程序完成打印.
Another way to reproduce this problem is to store the actual program given by OP in a file and execute with Python 3.x interpreter, you will see that the stdout
internally buffers the data and waits till the program finishes to print.
这篇关于为什么在循环中使用睡眠时 Python 中的打印不会暂停?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么在循环中使用睡眠时 Python 中的打印不会暂停?
基础教程推荐
- 合并具有多索引的两个数据帧 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01