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

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

В то время как input() пытается понять данные, введенные пользователем. Таким образом, вход, подобный helloworld, даже покажет ошибку как «helloworld is undefined».

В заключение, для python 2, чтобы ввести строку тоже, вам нужно ввести ее как 'helloworld', которая является общей структурой, используемой в python для использования строк.

471
задан Whymarrh 2 November 2015 в 19:43
поделиться

7 ответов

От ответ Magnus Lycka в списке рассылки :

можно пропустить буферизацию для целого процесса Python с помощью "Python-u" (or#!/usr/bin/env Python-u и т.д.) или путем установки переменной среды PYTHONUNBUFFERED.

Вы могли также заменить 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)
print 'Hello'
393
ответ дан o11c 2 November 2015 в 19:43
поделиться
  • 1
    Я думаю, что также очень маловероятно, что большинство разработчиков будет работать над системами, где масштабируемость является большой проблемой. Все общие платформы (ЛАМПА.NET, UNIX и т.д.) могут легко обработать очень крупный масштаб. Если Вы не создаете следующий Google, у Вас есть больше для волнения о, чем это. – Craig 13 February 2009 в 09:06

Можно создать освободивший буфер файл и присвоить этот файл sys.stdout.

import sys 
myFile= open( "a.log", "w", 0 ) 
sys.stdout= myFile

Вы не можете волшебно изменить предоставленный систему stdout; так как это предоставляется Вашей программе Python ОС.

3
ответ дан S.Lott 2 November 2015 в 19:43
поделиться

Да, это включено по умолчанию. Можно отключить его при помощи-u опции на командной строке при вызове Python.

11
ответ дан Nathan 2 November 2015 в 19:43
поделиться

Один путь, который будет освобожден буфер вывод, состоял бы в том, чтобы использовать sys.stderr вместо sys.stdout или просто звонить sys.stdout.flush(), чтобы явно вынудить запись произойти.

Вы могли легко перенаправить все распечатанное путем выполнения:

import sys; sys.stdout = sys.stderr
print "Hello World!"

Или перенаправить только для детали print оператор:

print >>sys.stderr, "Hello World!"

Для сброса stdout можно просто сделать:

sys.stdout = sys.__stdout__
2
ответ дан efotinis 2 November 2015 в 19:43
поделиться
  • 1
    да that' s ответ, язык программирования не имеет значения очень, хорошие кодеры делают! – Nils 17 December 2008 в 12:04

Да, это.

можно отключить его на командной строке с переключателем "-u".

, С другой стороны, Вы могли назвать .flush () на sys.stdout на каждой записи (или обернуть его с объектом, который делает это автоматически)

49
ответ дан Brian 2 November 2015 в 19:43
поделиться
# reopen stdout file descriptor with write mode
# and 0 as the buffer size (unbuffered)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Кредиты: "Sebastian", где-нибудь в списке рассылки Python.

стороннее РЕДАКТИРОВАНИЕ

Неподдерживаемый в последних версиях Python 3

74
ответ дан Mike 3 November 2015 в 05:43
поделиться

Вы также можете использовать fcntl для изменения флагов файлов на лету.

fl = fcntl.fcntl(fd.fileno(), fcntl.F_GETFL)
fl |= os.O_SYNC # or os.O_DSYNC (if you don't care the file timestamp updates)
fcntl.fcntl(fd.fileno(), fcntl.F_SETFL, fl)
4
ответ дан 22 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: