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

2023-12-23

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

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

print('hello')

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

from time import sleep

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

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

EditSublime 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 中


默认情况下exec命令用于执行构建系统中的命令,并且exec命令根本不缓冲输出。有更多信息在这个答案 https://stackoverflow.com/a/50068562/814803(它还提供了一个版本exec进行行缓冲)但简而言之exec启动一个线程来处理stdout和一个要处理的stderr,并且双方在获得数据后立即将其转发到面板。

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

例如,请参阅以下文本手册页stdout https://linux.die.net/man/3/stdout在Linux下:

流 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'

The Python.sublime-buildSublime 附带的使用这个参数python命令以确保输出是无缓冲的,并且使用该构建系统可以按示例程序的预期工作。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Sublime Text 3 中运行 Python 时如何删除输出缓冲 的相关文章

随机推荐