【问题标题】:Enthought Canopy doesn't print right away when statement occurs声明发生时,Enthought Canopy 不会立即打印
【发布时间】:2025-11-30 04:15:01
【问题描述】:

不久前,我从 Enthought 的旧 EPD 切换到他们更新的 Canopy 系统。在大多数情况下,它很好,但有一个方面特别令人烦恼。

每当我从 Canopy iPython 环境或命令行运行 python 脚本时,当脚本的那部分被命中时,我的print 语句实际上都不会立即打印出来。相反,多个prints 似乎会在以后一次全部执行。

举个例子……

import numpy as np

print "About to start long computation..."
a = np.random.randn(1e8)
print "Computation finished."

直到之后 a 完成生成后才打印第一条语句,此时两个语句同时打印。 (您可以通过观察 CPU 监视器来判断计算何时发生。)

有人知道这里发生了什么吗?如果相关,我在 Windows 7 机器上运行 Canopy 1.0.0.1160,Python 2.7.3 64bit。

【问题讨论】:

  • 如果不清楚,我在旧的环保署从来没有遇到过这个问题。
  • 只是为了缩小问题所在:如果你在打印语句之后执行import sys然后调用sys.stdout.flush(),它会立即出现吗?
  • 确实如此。这一定是问题所在,但是有没有办法在每个print 之后强制刷新,为什么 Canopy 不会像其他所有 python 发行版那样自动发生这种情况?
  • 是的,他们肯定设置了默认输出缓冲什么的。 *.com/questions/107705/python-output-buffering 有多种强制刷新选项。
  • 我使用的大多数 Python 缓冲区写入 stdout

标签: python enthought canopy


【解决方案1】:

这看起来像缓冲输出。尝试将您的脚本运行为:

python -u yourscript

-u 标志关闭缓冲。

(将python 替换为您操作系统的python 可执行文件的名称。)

【讨论】:

    【解决方案2】:

    不,这不是 EPD 和 Canopy 之间的变化。虽然我认为可能有一些默认缓冲关闭的 python 发行版,但 EPD 不是其中之一——性能损失可能太严重了(正如 kindall 的评论所提到的。)最好让程序员决定什么时候对用户很重要立即查看控制台输出(通常用于状态更新)。

    顺便说一句,Canopy GUI 中的 IPython 就是 IPython QtConsole。如果您依赖控制台 I/O,您可能还需要注意 QtConsole 这个长期存在的问题:

    我认为 Canopy IPython 没有合理的解决方法,除了“正确”执行,即使用刷新。

    https://support.enthought.com/entries/22157050-Canopy-Python-prompt-QtConsole-Can-t-run-interactive-OS-shell-commands

    【讨论】:

    • 谢谢乔纳森。对于以后来的人,我最终只是将python 别名为python -u 以用于从命令行运行的脚本;还没有决定是否值得强迫 Canopy 做同样的事情。我可以发誓这绝不是环保署的问题,虽然......