python - 奇怪的 python 打印行为

标签 python scripting interpreter

我在 python 2.7 脚本中使用 print 语句,在其中创建数据建模类的实例。它们是相当大的类,在初始化期间在属性 setter 中进行大量计算,因此它不是执行速度最快的脚本。我使用打印语句来了解进度,但有趣的是它们是如何执行的。代码看起来像这样:

    from __future__ import absolute_import, division, print_function, unicode_literals

    print('Loading data...', end='\t')
    data = LoadData(data_path)
    first_model = FirstModel(parameters).fit(data)
    print('Done.\nFitting second model...', end='\t')
    # prints 'Done.' and then there's a very long pause...
    # suddenly 'Fitting second model...' prints and the next model initializes almost immediately
   second_model = SecondModel(parameters).fit(data)
   results = second_model.forecast(future_dates)

为什么语句 print('Done.\nFitting secondary model...', end=\t') 首先打印“Done.”然后停顿很长一段时间?有一次我运行这段代码时,在“完成”之后。打印 在打印语句的其余部分之前,我遇到了错误。返回的错误是 SecondModel 中的错误,我也尝试将方法作为属性访问。这里发生了什么? python 如何或为何以这种违反直觉的方式执行此 print 语句?就好像解释器将换行符视为它应该开始查看代码的后面部分的指示。

最佳答案

默认情况下,print 调用会被缓冲。每当遇到换行符时,缓冲区就会被刷新(因此,您会看到 Done\n 出现)。但是,后续文本将保留在缓冲区中,直到下一个刷新它的事件(在没有要打印的后续换行符的情况下,Python 可能会返回到命令提示符或完全退出到 shell,具体取决于你如何运行这个脚本)。因此,您对 SecondModel().fit() 的耗时调用发生在两行显示之间

为了避免这种情况,您可以在 print 之后立即调用 sys.stdout.flush() 来手动刷新缓冲区。或者,如果您要迁移到 Python 3.3 或更高版本,您可以通过将附加参数 flush=True 传递到 print() 来简化此操作。 p>

错误消息可能会中断打印输出,反之亦然,因为默认情况下它们由两个单独的流处理:sys.stderrsys.stdout分别。两个流有单独的缓冲区。

关于python - 奇怪的 python 打印行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332142/

相关文章:

c# - 解释自定义语言

python - 如何在 Python 中构建一个 Brainfuck 解释器?

Python 套接字编程 - 错误的文件描述符错误

python - 如何直接获取序列的第<n>个排列的第<i>个元素(没有任何递归性)?

python - 使用 QuerySet 对象进行 django 查询

windows - Windows 的内置 ZIP 压缩可以编写脚本吗?

python - 使用 io.BytesIO 从 azure 存储读取图像?

shell - 如何在脚本中的特定字符后插入新行

linux - 在shell脚本中访问两个不同的Postgres数据库时出现密码问题

python - 进入python解释器时打印问候语