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

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

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

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

5 ответов

Решение

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

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

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

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

  • 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,

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

import io
print (io.DEFAULT_BUFFER_SIZE)

Я не знаю, относится ли это и к 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()

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

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

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 Натаном Рамеллой

Другие вопросы по тегам