2014-10-09 4 views
6

У меня есть сценарий питона, который выглядит примерно так:Использования тройника, чтобы получить в реальное время операторов печати из питона

for item in collection: 
    print "what up" 
    #do complicated stuff that takes a long time. 

В Баше, я запускаю этот скрипт, выполнив следующие действия:

$ python my.py | tee my_file.txt 

Однако , все, что я вижу в bash, - пустая строка, пока программа не завершится. Затем все печатные заявления появляются на одном.

Является ли это ожидаемой работой тройника? Могу ли я использовать тройник для просмотра вывода в режиме реального времени?

+0

Это будет проблема с питоном. Это преднамеренно. Он просто обнаруживает, что вывод не идет на терминал, поэтому он буферизуется. Вам нужно отключить буферизацию. Как это сделать, вероятно, лучше подходит для stackexchange.com. – Patrick

+1

Может быть, это поможет: http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe – Ketan

+1

наверху "import import sys '", а на строке с отступом под оператором печати выполните команду '' sys.stdout.flush() '" – Anthon

ответ

15

Python, как и многие программы, пытается свести к минимуму количество обращений к системному вызову write. Он делает это, собирая вывод нескольких операторов print, прежде чем он фактически записывает их в свой стандартный выходной файл. Этот процесс называется буферизацией вывода.

Когда Python подключен к терминалу, он не буферизует его вывод. Это имеет смысл, потому что человек в терминале хочет сразу увидеть выход.

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

Вы можете победить эту оптимизацию, вызвав sys.stdout.flush() всякий раз, когда вы хотите заставить Python записывать свой буферный вывод в свой стандартный выходной файл.

В вашем случае, попробуйте следующее:

import sys 
... 
for item in collection: 
    print "what up" 
    sys.stdout.flush() 
    #do complicated stuff that takes a long time. 
+0

Отличное объяснение! Я бы добавил, что вызов скрипта с флагом '-u' также решит вашу проблему, например. 'python -u my.py | tee my_file.txt' – BiBi