В процессе работы с Python нередко возникает ситуация, когда необходимо управлять процессом буферизации вывода. К примеру, при написании кода, который выдает данные в реальном времени, буферизация вывода может создать нежелательную задержку.
Буферизация вывода включена по умолчанию в интерпретаторе Python для sys.stdout
. Однако существуют способы ее отключить. Далее будут рассмотрены некоторые из них.
Использование параметра -u
Один из способов отключить буферизацию вывода — использовать параметр -u
в командной строке при запуске программы. К примеру, если у вас есть скрипт с именем script.py
, вы можете запустить его с отключенной буферизацией следующим образом:
python -u script.py
Обертка sys.stdout
в объект, который сбрасывает буфер после каждой записи
Это еще один способ отключить буферизацию вывода. В этом случае sys.stdout
оборачивается в объект, который сбрасывает буфер после каждой записи.
class Unbuffered(object): def __init__(self, stream): self.stream = stream def write(self, data): self.stream.write(data) self.stream.flush() def writelines(self, datas): self.stream.writelines(datas) self.stream.flush() def __getattr__(self, attr): return getattr(self.stream, attr) import sys sys.stdout = Unbuffered(sys.stdout)
Установка переменной окружения PYTHONUNBUFFERED
Переменная окружения PYTHONUNBUFFERED
может быть установлена для отключения буферизации вывода. Это можно сделать следующим образом:
export PYTHONUNBUFFERED=TRUE
Использование функции os.fdopen()
Функция os.fdopen()
может быть использована для открытия файла дескриптора и его последующей ассоциации с новым файловым объектом без буферизации.
import os import sys sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
В приведенных выше способах отключение буферизации вывода происходит глобально и влияет на все операции вывода. Тем не менее, в некоторых случаях может быть нужно сбросить буфер после конкретной операции вывода. В этом случае можно использовать функцию flush()
:
print('Hello, World!', flush=True)
В этом случае буфер сбрасывается сразу после операции print()
, обеспечивая немедленный вывод.
Добавить комментарий