Как промыть выход функции печати?


Как заставить функцию печати Python выводить на экран?

Это не дубликат отключить буферизацию вывода - связанный вопрос-это попытка вывода без буферизации, в то время как это является более общим. Лучшие ответы в этом вопросе слишком сильны или задействованы для этого (они не являются хорошими ответами для этого), и этот вопрос можно найти в Google относительным новичком.

14 915

14 ответов:

import sys
sys.stdout.flush()

печать по умолчанию печать в sys.stdout.

ссылки:

под управлением python -h Я вижу опции командной строки:

- u: unbuffered binary stdout и stderr; также PYTHONUNBUFFERED=x см. man-страницу для получения подробной информации о внутренней буферизации, относящейся к '-u'

здесь соответствующие док.

начиная с Python 3.3, вы можете заставить нормальный print() функция для того чтобы потопить без потребности использовать sys.stdout.flush(); просто установить "заподлицо" аргумента "истина". От документация:

print (*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

печать объектов в потоковый файл, разделенных sep и затем end. sep, end и file, если они присутствуют, должны быть заданы в качестве аргументов ключевого слова.

все аргументы без ключевых слов преобразуются в строки, такие как str() does и записываются в поток, разделенный sep и сопровождаемый end. И sep, и end должны быть строками; они также могут быть None, что означает использование значений по умолчанию. Если объекты не заданы, print () просто напишет конец.

аргумент file должен быть объектом с методом write(string); если он отсутствует или отсутствует, sys.стандартный вывод будет использоваться. буферизуется ли вывод обычно определяется файлом, но если аргумент ключевого слова flush имеет значение true, поток принудительно сбрасывается.

Как очистить вывод печати Python?

я предлагаю Пять способов сделать это:

  • в Python 3, позвоните print(..., flush=True) (аргумент flush недоступен в функции печати Python 2, и нет аналога для оператора print).
  • вызов file.flush() в выходном файле (мы можем обернуть функцию печати python 2 для этого), например,sys.stdout
  • применить это к каждому вызову функции печати в модуле с частичной функцией,
    print = partial(print, flush=True) применяется к модулю global.
  • применить это к процессу с флагом (-u) передано команде интерпретатора
  • применить это к каждому процессу python в вашей среде с PYTHONUNBUFFERED=TRUE (и снимите переменную, чтобы отменить это).

Python 3.3+

С помощью Python 3.3 или выше, вы можете просто предоставить flush=True в качестве ключевого аргумента для :

>>> 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.

также, как полагают в этот блог можно расконсервировать sys.stdout в режиме без буферизации:

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

каждого stdout.write и print деятельность автоматически будет потоплена потом.

С помощью -u переключатель командной строки работает, но это немного неуклюже. Это будет означать, что программа потенциально будет вести себя неправильно, если пользователь вызвал скрипт без . Я обычно использую пользовательский stdout, например:

class flushfile(object):
  def __init__(self, f):
    self.f = f

  def write(self, x):
    self.f.write(x)
    self.f.flush()

import sys
sys.stdout = flushfile(sys.stdout)

... Теперь все ваши print вызовов (которые используют sys.stdout неявно), будет автоматически flushed.

С Python 3.х они расширили print() функция:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

Итак, вы можете просто сделать:

print("Visiting toilet", flush=True)

Python Docs Entry

почему бы не попробовать использовать небуферизованный файл?

f = open('xyz.log', 'a', 0)

или

sys.stdout = open('out.log', 'a', 0)
import sys
print 'This will be output immediately.'
sys.stdout.flush()

идея Дэна не совсем работает:

#!/usr/bin/env python
class flushfile(file):
    def __init__(self, f):
        self.f = f
    def write(self, x):
        self.f.write(x)
        self.f.flush()

import sys
sys.stdout = flushfile(sys.stdout)

print "foo"

результат:

Traceback (most recent call last):
  File "./passpersist.py", line 12, in <module>
    print "foo"
ValueError: I/O operation on closed file

Я считаю, что проблема в том, что он наследует от класса file, который на самом деле не нужно. Согласно документам для sys.стандартный вывод:

stdout и stderr не должны быть встроены файловые объекты: любой объект является приемлемым пока он имеет метод write() который принимает строковый аргумент.

так изменение

class flushfile(file):

до

class flushfile(object):

он работает просто отлично.

вот моя версия, которая предоставляет writelines () и fileno () тоже:

class FlushFile(object):
    def __init__(self, fd):
        self.fd = fd

    def write(self, x):
        ret = self.fd.write(x)
        self.fd.flush()
        return ret

    def writelines(self, lines):
        ret = self.writelines(lines)
        self.fd.flush()
        return ret

    def flush(self):
        return self.fd.flush

    def close(self):
        return self.fd.close()

    def fileno(self):
        return self.fd.fileno()

очень понравилось решение Дэна! Для python3 сделайте:

import io,sys
class flushfile:
    def __init__(self, f):
        self.f = f
    def write(self, x):
        self.f.write(x)
        self.f.flush()
sys.stdout = flushfile(sys.stdout)

в Python 3 Вы можете перезаписать функцию печати со значением по умолчанию flush = True

def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
    __builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)

Я сделал это в Python 3.4:

'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')