По умолчанию print
печатает в sys.stdout
, который буферизуется при записи в интерактивный терминал, 1 , но буферизуется в блокепри записи в файл.
Итак, когда вы запустите свой код с помощью python myscript.py
из своего терминала или командной строки, вы увидите, что каждая строка отображается в том виде, в котором она напечатана, по желанию.
Но если вы запустите его, скажем, с помощью python myscript.py >outfile
, ничего не будет записано, пока буфер не заполнится (или пока скрипт не завершится, если этого никогда не произойдет).Обычно это нормально.Но, очевидно, как бы вы ни выполняли ваш скрипт в Komodo, он выглядит как обычный файл, а не интерактивный терминал для Python.
Возможно, вы можете это исправить, просто используя или настраивая Komodoиначе.
Я не знаю много о Комодо, но я вижу, что есть аддон для встраивания терминала ;возможно, если вы используете это вместо отправки вывода на встроенную консоль JavaScript (?), все будет работать лучше, но я действительно понятия не имею.
В качестве альтернативы, вы можете убедиться, что буфер выводаочищается после каждой строки, делая это вручную, например, передавая аргумент flush
в print
:
print(t, flush=True)
Если вы действительно хотите, вы можете дажезамените print
в вашем модуле функцией, которая всегда делает это:
import builtins
import functools
print = functools.partial(builtins.print, flush=True)
… но вы, вероятно, не хотите этого делать.
В качестве альтернативы, вы можете заменитьsys.stdout
с файловым объектом с линейной буферизацией над необработанным стандартным выводом, просто вызвав open
в соответствующем файле или дескрипторе файла:
sys.stdout = open(sys.stdout.fileno(), buffering=1)
Если выПоиск по переполнению стека или в Интернете, вы найдете много предложений, чтобы отключить буферизацию.И вы можете заставить Python использовать небуферизованный вывод с флагом -u
или переменной среды PYTHONUNBUFFERED
.Но это может не принести пользы в Python 3. 2
1.Как объясняет sys.stdout
, это обычный текстовый файл, подобный тем, которые возвращаются open
.Как объяснено в open
, это различие проводится путем вызова isatty
.
2.stdout
в Python 2 - это просто тонкая оболочка вокруг объекта C stdio, поэтому если вы откроете его без буферизации, буферизация не будет.stdout
в Python 3 - это здоровенная оболочка для необработанного файлового дескриптора, которая выполняет свою собственную буферизацию и декодирование (подробности см. В документах io
), поэтому -u
сделает sys.stdout.buffer.raw
небуферизованной, ноsys.stdout
само по-прежнему будет буферизовано, как объяснено в -u
документах.