Поскольку start () не просто вызывает run (). Он запускает новый поток и в этом потоке вызывает run ().
import sys
sys.stdout.flush()
print
печатью по умолчанию к sys.stdout
.
Python 2
объект файла Python 3
print()
sys.stdout
io.IOBase.flush()
(sys.stdout
наследовался flush
метод от [1 110]) Почему бы не попробовать использовать небуферизованный файл?
f = open('xyz.log', 'a', 0)
ИЛИ
sys.stdout = open('out.log', 'a', 0)
Я сделал это в Python 3.4:
'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')
Работая python -h
, я вижу параметр командной строки :
-u: освободивший буфер двоичный файл stdout и stderr; также PYTHONUNBUFFERED=x видят, что страница справочника для получения дополнительной информации о внутренней буферизации, касающейся '-u'
Вот, соответствующий документ .
Используя -u
работы переключателя командной строки, но это немного неуклюже. Это означало бы, что программа потенциально вела бы себя неправильно, если бы пользователь вызвал сценарий без -u
опция. Я обычно использую пользовательское stdout
, как это:
class flushfile:
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
неявно), будет автоматически flush
редактор
Идея Dan не вполне работает:
#!/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
я полагаю, что проблема состоит в том, что это наследовалось классу файла, который на самом деле не необходим. Согласно документам для sys.stdout:
stdout и stderr needn’t быть встроенными объектами файла: любой объект приемлем, пока он имеет запись () метод, который берет аргумент строки.
настолько изменяющийся
class flushfile(file):
к [1 110]
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()