【问题标题】:Why `print` content doesn't show immediately in terminal? [duplicate]为什么“打印”内容不会立即在终端中显示? [复制]
【发布时间】:2014-11-11 21:20:16
【问题描述】:

我有一个用于模拟的 python 脚本,通过 for 循环运行需要相当长的时间,并且每个循环需要不同的时间来运行,所以我在每个循环之后打印一个 . 作为监控速度的方法它运行以及它在脚本运行时通过for 语句的程度。

for something:
    do something
    print '.',

但是,当我在终端中的 iPython 中运行脚本时,这些点不会一个一个地打印出来,而是在循环结束时一次打印出来,这使得整个事情变得毫无意义。如何在运行时打印内联点?

【问题讨论】:

  • Line buffering,很有可能。打印后尝试发出sys.stdout.flush()。如果这样可以解决您的问题,那么缓冲实际上就是您的问题。
  • 您也可以将 stdout 设置为无缓冲……但执行此类操作的常用方法正是 @LukasGraf 所建议的。除了你可能想要sys.stdout.write('.'),而不是print '.',。首先,print 会给你点之间的空格。其次,理论上允许它在 stdout 所做的任何事情之上进行自己的缓冲(尽管 CPython 没有,而且我不知道有任何实现)。
  • 是的,它奏效了。谢谢!!我想知道是否有比仅仅打印点更好的方法......
  • sys.stdout.write 也是我推荐的。对于解决方法(例如,您无法修改源代码),您可以尝试使用 -u 运行 Python,如 here 所述
  • 尽管您的问题是关于为什么,但明显的后续问题将是“那我该如何关闭缓冲?”,所以我投票将其标记为重复。

标签: python macos terminal ipython


【解决方案1】:

如何在运行时打印内联点?

尝试刷新输出,如下所示:

for _ in range(10):
    print '.',
    sys.stdout.flush()
    time.sleep(.2)  # or other time-consuming work

或者对于 Python 3.x:

for _ in range(10):
    print('.', end=' ', flush=True)
    time.sleep(.2)  # or other time-consuming work

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2017-04-04
    • 2021-01-03
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多