Enthought Canopy在语句出现时不会立即打印。

3

不久前,我从Enthought旧版的EPD切换到他们更新的Canopy系统。总体而言,这很好,但其中一个方面一直特别令人困扰。

每当我在Canopy iPython环境中或从命令行运行Python脚本时,我的print语句都不会立即打印出来。相反,多个print似乎会在稍后的时间一起执行。

例如...

import numpy as np

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

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

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


3
为了缩小问题范围:如果你使用import sys并在打印语句之后调用sys.stdout.flush(),那么打印的结果是否会立即显示? - Danica
是的,他们一定设置了默认的输出缓冲或其他什么。在https://dev59.com/inVD5IYBdhLWcg3wDHDm上有许多强制刷新的选项可供选择。 - Danica
1
我使用过的大部分Python都将缓冲写入stdout - kindall
@kindall 通常情况下,对于以文本模式打开的文件,默认情况下将其设置为行缓冲,因此普通的print语句将刷新缓冲区。 - Danica
@Dougal,除非你使用-u选项运行Python,否则这不会刷新缓冲区。 - Hyperboreus
显示剩余2条评论
2个回答

3
这似乎是缓冲输出。尝试以以下方式运行脚本:
python -u yourscript
-u 标志可以关闭缓冲。
(将python替换为您操作系统上的Python可执行文件名称。)

2
不,这不是EPD和Canopy之间的变化。虽然我想可能有一些Python发行版默认关闭缓冲区,但EPD不是其中之一--性能损失可能太严重了(正如kindall的评论所提到的)。最好让程序员决定何时重要的是让用户立即看到控制台输出(通常是用于状态更新)。
顺便说一下,Canopy GUI中的IPython只是IPython QtConsole。如果您依赖控制台I/O,则还需要注意QtConsole的这个长期问题:
我认为在Canopy IPython中没有合理的解决方法,除了“正确地”使用flush。

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


谢谢Jonathan。对于以后的任何人,我最终只是将python的别名设置为从命令行运行的脚本中的python -u;还没有决定是否值得强制Canopy做同样的事情。尽管如此,我确信EPD从未出现过这个问题... - Blas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接