Как часто python сбрасывается в файл?


  1. Как часто Python сбрасывается в файл?
  2. Как часто Python сбрасывается в stdout?

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

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

5 162

5 ответов:

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

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

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

" необязательный аргумент буферизации указывает желаемый размер буфера файла:"

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

код:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)

вы также можете принудительно сбросить буфер в файл программно с помощью 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.

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

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

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

EDIT: я думаю, что вы бы авто-флеш в 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()

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

import io
print (io.DEFAULT_BUFFER_SIZE)

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

при включении кода ниже в файл __init__.py перед любым другим кодом, сообщения печатаются с print и любые ошибки больше не будут регистрироваться в журнале Ableton.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 поверхности скрипты Натан Рамелла