Подтвердить что ты не робот

Как часто python загружается в файл?

  • Как часто Python загружается в файл?
  • Как часто Python запускается в stdout?

Я не уверен (1).

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

4b9b3361

Ответ 1

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

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

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

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

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

код:

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

import io
print (io.DEFAULT_BUFFER_SIZE)

Ответ 5

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

При включении кода ниже в файл __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 от Натана Рамеллы