Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
07 Июл 2023
2 мин
670

Отключение буферизации вывода в Python

В процессе работы с Python нередко возникает ситуация, когда необходимо управлять процессом буферизации вывода. К примеру, при написании кода, который

В процессе работы с 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(), обеспечивая немедленный вывод.

Тест на профориентацию
За 10 минут узнайте, как ваш опыт пригодиться в IT индустрии
Подробнее
Тест на профориентацию

Добавить комментарий