回车不能维持新的光标位置

时间:2019-05-03 07:36:32

标签: 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)

我希望输出重置为

Reading... 0|1|2|3|4|
# reset
Reading... 5|6|7|8|9
# reset
Reading... 10|11|12|13|14
# ...

但是,相反,在初始回车之后,光标似乎返回到当前行文本的末尾:

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|

这似乎是sleep时间的函数,因为将等待时间设置为.05实际上是可行的(您可以在运行代码时看到输出更新):

Reading... 25|26|27|28|29|

这是怎么回事?它似乎是Jupyter专用的,因为当我在python3终端会话中交互式运行时,以上两种都没有发生(不知道14 / 15|2 / { {1}}来自...):

|3

2 个答案:

答案 0 :(得分:2)

它们之间的区别是常规的python stdout是<class '_io.TextIOWrapper'>,而jupyter的是<class 'ipykernel.iostream.OutStream'>,因此行为会有所不同。

您可以使用isatty()检查流的流向:

在jupyter上,它将返回False,在常规python中将返回True

问题是在jupyter中所有输出都是异步显示的,因此您可能需要将其与flush同步或导入

from IPython.core.display import clear_output

并手动调用它以实现进度条。

答案 1 :(得分:0)

似乎是一个缓冲问题。您可以尝试以下几种选择:

  • 手动致电stdout.flush()
  • 在运行笔记本电脑之前设置PYTHONUNBUFFERED环境变量。
  • 如果您使用的是Python 3.3+,则将print()flush=True一起使用,而不是stdout.write()