【问题标题】:How to remove output buffering when running Python in Sublime Text 3如何在 Sublime Text 3 中运行 Python 时删除输出缓冲
【发布时间】:2018-05-11 16:40:24
【问题描述】:

当我构建 Python 3 脚本时,如何从 Sublime Text 3 中删除输出缓冲?我想要实时输出。

我正在使用带有 Anaconda 插件、Python 3.6 和 Linux Mint 18 的 Sublime Text 3。当我使用 control-b 运行一个简单的脚本时:

print('hello')

我在名为“构建输出”的单独窗口中获得即时输出。当我使用带有重复输出的脚本时,例如:

from time import sleep

count = 0
print('starting')
while True:
    print('{} hello'.format(count))
    count += 1
    sleep(0.5)

最初我在“构建输出”中看到一个空白屏幕。一段时间后,它填充了数百行输出。看起来输出正在被缓冲。当缓冲区已满时,它会立即将所有内容输出到“构建输出”屏幕。

编辑 Sublime Text 允许自定义构建配置。默认的 Python 构建适用于 python 2。我输入了 Python 3 的构建配置并错过了 -u 标志。解决方法是将 -u 标志放在 Python 3 构建中。

文件:Python3.sublime-build

{
    "shell_cmd": "/usr/bin/env python3 -u ${file}",
    "selector": "source.python",
    "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
    "working_dir": "${file_path}",
}

保存在 sublime_install/Data/Packages/User/Python3.sublime-build 中

【问题讨论】:

  • Sublime 不会缓冲输出到面板;事实上,它是如此无缓冲,如果你同时输出到stdout 和stderr,这两者将在行的中途混合在一起。我不使用那个包;它是否将-u 指定给python 命令来告诉python 不要缓冲输出?
  • 我错过了构建配置中的 -u 标志。谢谢你的提示。将此作为答案,我会接受。 Sublime Text 允许自定义构建配置。默认 Python 构建适用于 python 2。我输入了 Python 3 的构建配置并错过了 -u 标志。

标签: python sublimetext3


【解决方案1】:

默认情况下,exec 命令用于执行构建系统中的命令,exec 命令根本不缓冲输出。在this answer 中有更多信息(它还提供了一个用于行缓冲的exec 版本)但简而言之exec 启动一个线程来处理stdout 和一个处理stderr,并且都转发任何数据他们一拿到面板就会进入面板。

因此,像您在此处描述的问题通常是由程序自己进行缓冲引起的。根据您使用的语言和平台,缓冲可能会以意想不到的方式发生变化:

例如在Linux下看到man page for stdout中的这段文字:

流标准错误是无缓冲的。当流标准输出指向终端时,它是行缓冲的。在调用 fflush(3) 或 exit(3) 或打印换行符之前,部分行不会出现。这可能会产生意想不到的结果,尤其是在调试输出时。

在一般情况下,解决此问题的方法是修改程序本身以确保它没有缓冲,而如何做到这一点取决于您使用的语言和您所在的平台。它可以像设置环境变量一样简单,也可以像启动代码一样复杂,以确保在任何情况下都按照您的预期设置缓冲。

在 Python 的特定情况下,解释器的 -u 命令行参数告诉 Python 保持无缓冲:

-u     : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x
         see man page for details on internal buffering relating to '-u'

Sublime 附带的Python.sublime-build 使用python 命令的这个参数来确保输出是无缓冲的,并且使用该构建系统可以为您的示例程序正常工作。

我不使用 Anaconda 包,所以我不确定它是否提供了自己的构建系统,但您可能需要检查您正在使用的构建命令以确保它使用 -u。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2014-08-26
    • 2014-02-08
    • 2023-03-24
    • 2014-03-01
    相关资源
    最近更新 更多