在Sublime Text 3中运行Python时如何消除输出缓冲?

6
如何在Sublime Text 3中在构建Python 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 标志。解决方法是在 Python 3 构建中加入 -u 标志。
文件: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 中。

1
Sublime不会将输出缓冲到面板中;实际上,它是如此的无缓冲,以至于如果您同时输出到stdoutstderr,则两者将在行的中途混合在一起。我不使用那个包;它是否指定了-upython命令,告诉Python不要缓冲输出? - OdatNurd
1
我在构建配置中错过了-u标志。谢谢提示。将其作为答案并我会接受它。Sublime Text允许自定义构建配置。默认的Python构建是针对Python 2的。我输入了一个Python 3的构建配置,但错过了-u标志。 - Oppy
1个回答

3
默认情况下,构建系统中使用exec命令来执行命令,并且exec命令不会缓冲输出。在这个答案中有更多信息(它还提供了一个进行行缓冲的exec版本)。简而言之,exec启动一个线程来处理stdout和一个线程来处理stderr,并且两者只要收到数据就立即将其转发到面板。
因此,像您在此处描述的问题通常是由程序自己的缓冲引起的。根据您使用的语言和平台,缓冲可能以意想不到的方式改变:
例如,在Linux下stdoutman页面中看到以下文本:
“流stderr未缓冲。当流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'
Python.sublime-build是Sublime自带的文件,它使用python命令的这个参数来确保输出不被缓冲,在使用该构建系统时,您的示例程序可以正常工作。我不使用Anaconda软件包,所以我不确定它是否提供自己的构建系统,但您可能需要检查您正在使用的构建命令,以确保它使用了-u参数。

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