【问题标题】:sys.stdout.write() Acting different in interactive modesys.stdout.write() 在交互模式下表现不同
【发布时间】:2020-07-14 12:17:58
【问题描述】:

我有代码:

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)。为什么它的行为不同以及如何缓解这种情况?

【问题讨论】:

  • 在交互模式下,表达式的结果(如果不是None)会自动显示——文件(-like object)上.write()的返回值是字节数/字符数书面。因此,您正在编写的 12 个字符的字符串后跟一个“12”。 print() 没有这个问题,因为它返回 None。

标签: python stdout interactive-mode


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    另外需要注意的是python3 print()sys.stdout.write() 之间的区别是它们各自的返回类型。 print() 返回无,sys.stdout.write 返回字符串的长度。请参阅to this answer。 返回类型是获得额外12的原因。

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2023-04-05
      • 1970-01-01
      • 2020-02-23
      相关资源
      最近更新 更多