Как удалить буферизацию вывода при запуске Python в Sublime Text 3 - PullRequest
0 голосов
/ 11 мая 2018

Как я могу удалить буферизацию вывода из Sublime Text 3 при создании скрипта Python 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)

Изначально я получаю пустой экран в «Построить вывод».Некоторое время спустя он заполняется несколькими сотнями строк вывода.Похоже, вывод буферизуется.Когда буфер заполнен, он выводит все сразу на экран «Build output».

Edit 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

1 Ответ

0 голосов
/ 13 мая 2018

По умолчанию команда exec используется для выполнения команд в системах сборки, а команда exec вообще не буферизует вывод.В есть больше информации в этом ответе (который также предоставляет версию exec, которая выполняет буферизацию строки), но вкратце exec запускает один поток для обработки stdout и один для обработки stderr,и оба перенаправляют все данные, которые они получают, на панель, как только они их получают.

Таким образом, проблема, подобная той, которую вы здесь описываете, обычно вызвана тем, что программа выполняет собственную буферизацию.В зависимости от языка и платформы, которые вы используете, буферизация может отличаться от ожидаемой неожиданным образом:

Например, см. Этот текст на справочной странице для 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'

Python.sublime-build, поставляемый с Sublime, использует этот аргумент для команды python, чтобы гарантировать, что вывод не буферизован, и, используя этосистема сборки работает, как и ожидалось, для вашей программы-примера.

Я не использую пакет Anaconda, поэтому я не уверен, предоставляет ли он свои собственные системы сборки или нет, но вы можете проверить команду сборки, котораявы используете, чтобы убедиться, что он использует -u.

...