2013-06-07 3 views
0

В моем питон скрипт, у меня есть это:Почему я не могу хвост моего журнала?

count = 0 
while 1: 
    print count 
    count += 1 

Я сохранил этот файл, и я побежал.

nohup python count.py >> test.log & 

$tail -f test.log 

Ничего не появляется, когда я его заворачиваю.

+0

Я запустил ваш скрипт и сделал хвост ... он работает отлично. у вас есть что-то еще. – tdelaney

ответ

7

Когда вы перенаправляете вывод Python, поток stdout открывается в буферном режиме (вместо режима с линейной буферизацией). Это означает, что вывод сохраняется в памяти до тех пор, пока до сброса буфера не будет напечатано достаточно строк.

Чтобы увидеть линии сразу, вам нужно очистить выходной поток:

import sys 

count = 0 
while 1: 
    print count 
    sys.stdout.flush() 
    count += 1 

В качестве альтернативы, используйте переключатель -u командной строки, чтобы заставить небуферизованный I/O:

nohup python -u count.py >> test.log & 

или вы можете использовать PYTHONUNBUFFERED переменная среды:

PYTHONUNBUFFERED=1 nohup python count.py >> test.log & 

или re-o перо stdout указатель_на_файл в небуферизованном режиме:

import os 
import sys 

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) 

В Python 3.3 и выше это все немного проще; Вы просто скажите print() промывать:

print(count, flush=True) 
+0

Возможно, есть способ сделать записи небуферизованными, но я не знаю python. – theglauber

+0

Но сценарий печатает большой объем информации. Выходной буфер часто сбрасывается, и он должен быть достаточно тонким. Буферизация в целом хороша для производительности системы - поэтому ее значение по умолчанию. – tdelaney

+0

@tdelaney: Да, я согласен; поэтому я сначала представил параметр '.flush()'; вы можете контролировать частоту флешей, по крайней мере. –

0

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

Смежные вопросы