【问题标题】:How to flush the printed statements in IPython如何在 IPython 中刷新打印的语句
【发布时间】:2013-06-27 12:51:41
【问题描述】:

我想在我的函数循环期间打印一些调试语句,我使用 IPython 调用该函数。让一个示例函数为:

def test_print():
    import time
    for i in range(5):
        time.sleep(2)
        print i,  time.time()

结果如下:

0 1372337149.84
1 1372337151.84
2 1372337153.85
3 1372337155.85
4 1372337157.85

我希望打印每一行,然后等待 2 秒。但行为如下。我首先观察:

0 1372337149.84
1 

然后,2 秒后,我观察到1 的时间戳和下一行的 id,即2。我终于观察到了最后一个时间戳。我不明白为什么它的行为是这样的,而不是一次一行。有什么想法吗?我是否需要特殊的刷新功能来打印等待打印的内容?

【问题讨论】:

  • 它对我来说正常工作。
  • 使用 CPython,它的行为符合预期。适用于 Linux 和 Windows。
  • 我使用的是 Canopy 1.0.1。它有 Python 2.7.3 64 位。
  • 我在 Linux 上使用 CPython 2.6.5,它的行为符合预期。
  • @AshwiniChaudhary 可能取决于您是从 CLI 还是 GUI 运行它。如果它是从 GUI 运行的,它可能会将 stdout 重定向到 tty 以外的东西,这将使流完全缓冲而不是行缓冲。

标签: python ipython


【解决方案1】:

我从未使用过 IPython,但在每个 print 语句之后刷新标准输出就足够了。

这样的事情应该可以工作......

def test_print():
    import time
    import sys
    for i in range(5):
        time.sleep(2)
        print i,  time.time()
        sys.stdout.flush()

【讨论】:

  • 但是,print 会自动添加新行,所以无论如何它都应该被刷新。
  • @Elazar 在 CPython 中,也许。也许 IPython 的行为有所不同。
  • @Aya 我认为这种行为是内置在 libc 中的。
  • @Elazar 是bit more complicated than that,所以这取决于sys.stdout.isatty()。还值得注意的是python 有一个-u 选项来使用无缓冲的标准输出。
猜你喜欢
  • 2014-03-26
  • 2015-10-07
  • 2021-06-23
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多