Як відмити висновок друку Python?
Я пропоную п'ять способів зробити це:
- У Python 3 зателефонуйте
print(..., flush=True)
(аргумент flush недоступний у функції друку Python 2, і аналог для оператора print не існує).
- Зателефонуйте
file.flush()
на вихідний файл (для цього ми можемо зафіксувати функцію друку python 2), наприклад,sys.stdout
- застосувати це до кожного виклику функції друку в модулі з частковою функцією,
print = partial(print, flush=True)
застосованої до модуля глобального.
- застосувати це до процесу за допомогою прапора (
-u
), переданого команді інтерпретатора
- застосуйте це до кожного процесу python у вашому оточенні
PYTHONUNBUFFERED=TRUE
(та вимкніть змінну, щоб скасувати це).
Python 3.3+
Використовуючи Python 3.3 або новішої версії, ви можете просто навести flush=True
як аргумент ключового слова print
функції:
print('foo', flush=True)
Python 2 (або <3.3)
Вони не підтримали flush
аргумент на Python 2.7. Отже, якщо ви використовуєте Python 2 (або менше 3,3) і хочете код, сумісний як з 2, так і з 3, я можу запропонувати наступний код сумісності. (Зверніть увагу, що __future__
імпорт повинен бути в / дуже "біля верхньої частини вашого модуля "):
from __future__ import print_function
import sys
if sys.version_info[:2] < (3, 3):
old_print = print
def print(*args, **kwargs):
flush = kwargs.pop('flush', False)
old_print(*args, **kwargs)
if flush:
file = kwargs.get('file', sys.stdout)
# Why might file=None? IDK, but it works for print(i, file=None)
file.flush() if file is not None else sys.stdout.flush()
Вищенаведений код сумісності охоплює більшість застосувань, але про більш ретельне звернення див. six
Модуль .
Крім того, ви можете просто зателефонувати file.flush()
після друку, наприклад, із заявою друку на Python 2:
import sys
print 'delayed output'
sys.stdout.flush()
Зміна за замовчуванням в одному модулі на flush=True
Ви можете змінити типову функцію друку, використовуючи functools.partial у глобальному масштабі модуля:
import functools
print = functools.partial(print, flush=True)
якщо ви подивитесь на нашу нову часткову функцію, принаймні в Python 3:
>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)
Ми можемо бачити, що це працює як звичайно:
>>> print('foo')
foo
І ми можемо фактично замінити новий дефолт:
>>> print('foo', flush=False)
foo
Зауважте ще раз, це змінює лише поточну глобальну область застосування, оскільки назва друку на поточній глобальній області буде затьмарювати вбудовану print
функцію (або не відміняти функцію сумісності, якщо ви використовуєте її в Python 2, у цій поточній глобальній області).
Якщо ви хочете зробити це всередині функції замість глобальної області модуля, слід вказати іншу назву, наприклад:
def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')
Якщо ви оголошуєте його глобальним у функції, ви змінюєте його у глобальному просторі імен модуля, тому вам слід просто розмістити його у глобальному просторі імен, якщо тільки ця конкретна поведінка не є саме такою, яку ви хочете.
Зміна за замовчуванням процесу
Я думаю, що найкращим варіантом тут є використання -u
прапора для отримання розблокованого виводу.
$ python -u script.py
або
$ python -um package.module
З документів :
Примушуйте stdin, stdout та stderr бути абсолютно нерозкритими. У системах, де це має значення, також поставте stdin, stdout та stderr у бінарний режим.
Зверніть увагу, що у файлі file.readlines () та File File (для рядка в sys.stdin) є внутрішня буферизація, на яку ця опція не впливає. Щоб вирішити це, вам потрібно буде використовувати файл.readline () всередині 1: цикл.
Зміна за замовчуванням для операційного середовища оболонки
Ви можете отримати таку поведінку для всіх процесів python у середовищі чи середовищах, які успадковують оточення, якщо встановити змінну оточення на непорожній рядок:
наприклад, в Linux або OSX:
$ export PYTHONUNBUFFERED=TRUE
або Windows:
C:\SET PYTHONUNBUFFERED=TRUE
з документів :
ПІТОНУНБУФЕР
Якщо для цього встановлено не порожню рядок, це рівнозначно параметру -u.
Додаток
Ось довідка щодо функції друку з Python 2.7.12 - зауважте, що аргументу немає flush
:
>>> from __future__ import print_function
>>> help(print)
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
__future__
версія не включає,flush
оскільки "аргумент flush додано в Python 3.3 (після того, як print () було підтримано в 2.7 через майбутній імпорт)" bugs.python.org/issue28458