- Як часто Python передає файл?
- Як часто Python змивається на вигляд?
Я не впевнений (1).
Що стосується (2), я вважаю, що Python змикається після кожного нового рядка. Але, якщо ви перевантажуєте stdout для файлу, він промітає так часто?
Я не впевнений (1).
Що стосується (2), я вважаю, що Python змикається після кожного нового рядка. Але, якщо ви перевантажуєте stdout для файлу, він промітає так часто?
Відповіді:
Для файлових операцій Python використовує буферизацію за замовчуванням операційної системи, якщо ви не налаштовуєте це на інше. Ви можете вказати розмір буфера, небуферований або буферний рядок.
Наприклад, відкрита функція приймає аргумент розміру буфера.
http://docs.python.org/library/functions.html#open
"Необов'язковий аргумент буферизації вказує бажаний розмір буфера файлу:"
код:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
я отримую належну буферизацію ліній. Але якщо я роблю щось більше (хотілося open('file.txt', 'w', 512)
), воно буферизує повне io.DEFAULT_BUFFER_SIZE
8192. Це помилка Python, помилка Linux чи помилка ID10t?
stdout
бути лінійно захищеним, незалежно від того, чи це консоль чи перенаправлена на файл?
write()
ручку файлу, вихід виводиться в пам'ять і накопичується до повного заповнення буфера ... в цей час буфер стає "розмитим" (вміст записується з буфера в файл). Ви можете явно очистити буфер, зателефонувавши flush()
методу на файлову ручку.
Ви також можете примусити залишити буфер у файл програмно за допомогою 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
.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
навіть означає. Навіщо нам це потрібно? Для чого це? чому я повинен дбати про це?
Я не знаю, чи це стосується і 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 з модуля io.
import io
print (io.DEFAULT_BUFFER_SIZE)
Ось ще один підхід - до вибору ОП, який саме він віддає перевагу.
Якщо включити наведений нижче код у __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 Натан Рамелла