sys.stdout.write() 在交互模式下表现不同

sys.stdout.write() Acting different in interactive mode

我有代码:

import sys
import time

for i in range(10):
    sys.stdout.write("\r Loading: {}".format(i))
    sys.stdout.flush()
    time.sleep(0.5)

当我 运行 python3 dynamic_print.py 时,它工作得很好,但是当我通过键入 python3 启动交互式解释器时,将上面的代码复制并 运行 到其中,我得到输出:

 Loading: 012
 Loading: 112
 Loading: 212
 Loading: 312
 Loading: 412
 Loading: 512
 Loading: 612
 Loading: 712
 Loading: 812
 Loading: 912

最后两位数 12,每次我 运行 时都会更新(上次我 运行 时是 11)。为什么它的行为不同以及如何缓解这种情况?

12write的return值,即写入的字符数。在交互模式下打印出来,然后换行

要解决此问题,您可以向解释器表明您对此值不感兴趣(例如使用 _ = stdout.write(s)),或者您可以将所有内容放入函数中,从而使其远离 REPL

我建议做后者,例如类似于:

def looper(n):
    for i in range(n):
        sys.stdout.write("\r Loading: {}".format(i))
        sys.stdout.flush()
        time.sleep(0.5)
    sys.stdout.write("\n")

然后调用为 looper(10)

首先你会得到不同的输出,因为当你 运行 python3 dynamic_print python 编译你的文件并为你的 python 代码(.pyc)生成字节码时在 python 运行 时间内执行。

当您在控制台上使用 python3 时,它会在您输入命令时对其进行解释。因此,您不能仅通过 清除 python 控制台中生成的输出。这就是为什么您每次都在新行中获得输出的原因。

另一件需要注意的事情是 python3 print()sys.stdout.write() 之间的区别是它们每个都有 return 类型。 print() returns none 和 sys.stdout.write returns 字符串的长度。参考 to this answer。 return 类型是获得额外 12.

的原因