2

我有代码:

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时都会更新(这是我上次运行它的时候)。为什么它的行为不同以及如何减轻这种情况?

4

2 回答 2

3

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

要解决此问题,您可以向解释器表明您对此值不感兴趣(例如使用_ = 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)

于 2020-07-14T12:32:28.543 回答
1

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

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

另一个需要注意的是 python3 之间的区别,print()并且sys.stdout.write()是它们每个都有的返回类型。print()返回无并sys.stdout.write返回字符串的长度。参考这个答案。返回类型是获得额外12的原因。

于 2020-07-14T12:50:34.947 回答