回车不维持新的光标位置

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)

Tom*_*art 0

看起来像是缓冲问题。有几个选项可以尝试:

  • 手动调用stdout.flush()
  • PYTHONUNBUFFERED在运行笔记本之前设置环境变量。
  • 如果您使用的是 Python 3.3+,请使用print()withflush=True代替。stdout.write()