运行以下简单循环:
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
答案 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
环境变量。print()
与flush=True
一起使用,而不是stdout.write()
。