По умолчанию команда 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
.