gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:46 24 4
gpt4 key购买 nike

当我构建 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 标志。解决方法是在 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

最佳答案

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

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

例如,请参阅 man page for stdout 中的这段文字在 Linux 下:

The stream stderr is unbuffered. The stream stdout is line-buffered when it points to a terminal. Partial lines will not appear until fflush(3) or exit(3) is called, or a newline is printed. This can produce unexpected results, especially with debugging output.

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

在 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 包,所以我不确定它是否提供自己的构建系统,但您可能需要检查您正在使用的构建命令以确保它使用 -你.

关于python - 在 Sublime Text 3 中运行 Python 时如何删除输出缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50296736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com