【问题标题】:Python sleep() inhibit print with comma?Python sleep() 用逗号禁止打印?
【发布时间】:2015-08-27 21:16:57
【问题描述】:

如果我想使用带逗号的打印 (2.6),只要不使用 time.sleep(),它就可以正常工作。

如果你使用带逗号的print,然后调用sleep;如果您处于循环中,则该字符串将永远不会打印。

例子:

a=1
b=10
while a<b:
    print "yes",
    a=a+1

这行得通,您会看到 yes 在同一行打印了 10 次。 但这行不通。

a=1
b=10
while a<b:
    print "yes",
    time.sleep(1)
    a=a+1

期望会打印一个yes;然后等待一秒钟,然后将打印下一个是。相反,您会在 10 秒后看到一串 10 yes 打印出来。

如果你使用 while 循环也是如此;只要循环正在运行,并且你有一个 sleep 语句,字符串直到结束才会打印。

要使其正常工作,请删除逗号。 如果要指定要在每个字符串之间等待多长时间,这将无法在同一行上打印字符串。

这是打印功能的错误吗?

【问题讨论】:

  • 看起来标准输出没有被刷新。

标签: python python-2.7


【解决方案1】:

print 不会自动刷新您的输出。您需要手动执行此操作。这可以通过使用sys模块的stdout.flush来完成

import sys,time
a=1
b=10
while a<b:
    print "yes",
    sys.stdout.flush()
    time.sleep(1)
    a=a+1

这是阻止 Python 使用缓冲 stdio 管道的另一种方法(感谢 abarnert

使用-u 选项执行您的程序

python -u filename.py

来自手册页。

-u
强制 stdinstdoutstderr完全无缓冲

Python3.3 的最后一种方法是使用 flush 参数到 print 函数

输出是否缓冲通常由文件决定,但如果 flush关键字参数为真,流被强制刷新。

3.3 版更改:添加了 flush 关键字参数。

【讨论】:

  • 这行得通....为什么你必须强行刷新标准输出?没有换行就意味着没有刷新?
  • 不。它由操作系统设计者实现。 Linix 终端仅在换行时刷新。对于文件,它会在文件关闭时刷新。
  • linux终端与它完全没有关系。 linux shell 可以,但几乎没有。真正的问题是 stdio 管道在交互时默认是行缓冲的,而 Python 2 仅依赖于 stdio。 Python可以将管道设置为无缓冲,或者您甚至可以在您自己的 Python 程序中执行此操作,而 bash 和您的终端都不会关心。
  • @BhargavRao:最终,是的,我猜 Python 3 停止使用 stdio 的事实意味着您可以说 stdio 是问题所在。在 3.x 中,Python 在原始文件描述符之上使用一堆适配器并进行自己的缓冲。但默认情况下它所做的非常接近 stdio 在 POSIX 系统上所做的,所以我认为更好的表达方式是 没有 有问题;出于充分的理由,标准输出默认是行缓冲的。在 3.3 中,他们在 print 中添加了一个 flush 关键字参数,用于“主要是行缓冲,但不是这个特定的 print 调用”。
  • @BhargavRao:一切看起来都不错。我不确定你是否需要提及 Python 3.x,因为一切都发生了很大的变化,但对于未来的搜索者来说并没有什么坏处,因为他不知道 2。 x 和 3.x 是不同的,所以当然,为什么不呢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多