Mic*_*ico 5 python python-3.x jupyter-notebook
运行以下简单循环:
from sys import stdout
from time import sleep
for ii in range(30):
sleep(.05)
if ii % 5 == 0:
stdout.write('\rReading... %d|' % ii)
else:
stdout.write('%d|' % ii)
Run Code Online (Sandbox Code Playgroud)
我希望输出重置像
Reading... 0|1|2|3|4|
# reset
Reading... 5|6|7|8|9
# reset
Reading... 10|11|12|13|14
# ...
Run Code Online (Sandbox Code Playgroud)
但是,相反,在初始回车之后,光标似乎返回到当前行文本的末尾:
Reading... 25||2|3|4|6|7|8|9|11|12|13|14|16|17|18|19|21|22|23|24|26|27|28|29|
Run Code Online (Sandbox Code Playgroud)
这似乎是时间的函数sleep,因为将等待时间设置为.05实际有效(您可以在运行代码时看到输出更新):
Reading... 25|26|27|28|29|
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?它似乎是Jupyter专用的,因为当我在python3终端会话中交互式运行时,以上两种都没有发生(不知道14/ 15和|2/ |3的来源...):
Reading... 0|14
1|2
2|2
3|2
4|2
Reading... 5|14
6|2
7|2
8|2
9|2
Reading... 10|15
11|3
12|3
13|3
14|3
Reading... 15|15
16|3
17|3
18|3
19|3
Reading... 20|15
21|3
22|3
23|3
24|3
Reading... 25|15
26|3
27|3
28|3
29|3
Run Code Online (Sandbox Code Playgroud)
看起来像是缓冲问题。有几个选项可以尝试:
stdout.flush()。PYTHONUNBUFFERED在运行笔记本之前设置环境变量。print()withflush=True代替。stdout.write()