Как часто Python сбрасывается в файл? - PullRequest
195 голосов
/ 02 июля 2010
  1. Как часто Python сбрасывает в файл?
  2. Как часто Python сбрасывается на стандартный вывод?

Я не уверен насчет (1).

Что касается (2), я думаю, что Python сбрасывает на стандартный вывод после каждой новой строки. Но если вы перегружаете стандартный вывод в файл, он очищается так часто?

Ответы [ 5 ]

288 голосов
/ 02 июля 2010

Для файловых операций Python использует буферизацию по умолчанию операционной системы, если вы не настроите ее иначе.Вы можете указать размер буфера, небуферизованный или буферизованный строкой.

Например, функция открытия принимает аргумент размера буфера.

http://docs.python.org/library/functions.html#open

"Дополнительная буферизацияАргумент задает желаемый размер буфера файла: «

  • 0 означает небуферизованный,
  • 1 означает буферизацию строки,
  • любое другое положительное значение означает использование буфера (приблизительно) этот размер.
  • Отрицательная буферизация означает использование системной настройки по умолчанию, которая обычно буферизуется строкой для tty-устройств и полностью буферизуется для других файлов.
  • Если не указано, используется системное значение по умолчанию.

код:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
153 голосов
/ 10 марта 2011

Вы также можете принудительно сбросить буфер в файл программным способом flush().

with open('out.log', 'w+') as f:
    f.write('output is ')
    # some work
    s = 'OK.'
    f.write(s)
    f.write('\n')
    f.flush()
    # some other work
    f.write('done\n')
    f.flush()

Я нашел это полезным при настройке выходного файла с tail -f.

13 голосов
/ 02 июля 2010

Я не знаю, относится ли это и к python, но я думаю, что это зависит от операционной системы, которую вы используете.

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

Возможно, вы сможете автоматически очистить выход, если это то, что вам нужно.

РЕДАКТИРОВАТЬ: Я думаю, что вы бы автоматически сбросить в Python таким образом (на основе от здесь )

#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()
12 голосов
/ 20 мая 2016

Вы также можете проверить размер буфера по умолчанию, вызвав атрибут DEFAULT_BUFFER_SIZE только для чтения из модуля io.

import io
print (io.DEFAULT_BUFFER_SIZE)
1 голос
/ 29 июля 2016

Вот другой подход, вплоть до ОП, чтобы выбрать, какой он предпочитает.

При включении приведенного ниже кода в файл __init__ .py перед любым другим кодом сообщения, напечатанные с помощью print, и любые ошибки больше не будут записываться в файл Ableton Log.txt, а для отдельных файлов на вашем диске:

import sys

path = "/Users/#username#"

errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog

(для Mac измените #username# на имя вашей пользовательской папки. В Windows путь к вашей пользовательской папке будет иметь другой формат)

Когда вы открываете файлы в текстовом редакторе, который обновляет его содержимое при изменении файла на диске (например, для Mac: TextEdit не делает, а TextWrangler делает), вы увидите, что журналы обновляются в режиме реального времени.

Авторы: этот код был скопирован в основном из сценариев панели управления liveAPI Натаном Рамеллой

...