python: перенаправить вывод в текстовый файл и отобразить его в режиме реального времени

У меня есть функция python, которая вызывает множество служб и печатает результаты служб, вызываемых в файле журнала. это мой код:

def coordinator():
   f = file(path,'a')
   sys.stdout = f
   /* do a lot of stuff */
   f.close()
   with open(path) as log:
        logs = log.read()
        return jsonify(log = logs)

Результат функции возвращается в функцию jQuery getJSON, которая отображает окончательный файл журнала на веб-странице:

$.getJSON('/../coordinator',
  {//parameters},
  function(data) {
    //display data.log
  }
);

Моя проблема в том, что пользователь может видеть файл журнала только после завершения выполнения. Есть ли способ отображать логи так, как они пишутся в режиме реального времени??


person Mahmoud Ksemtini    schedule 20.04.2015    source источник
comment
coordinator может запустить операцию в фоновом режиме и немедленно вернуться с каким-либо идентификатором файла журнала. Другой метод может быть написан для чтения файла. Существует множество других вариантов, в том числе роскошное промежуточное ПО, которое использует что-то вроде zeromq для запуска операций и предоставляет издателю возможность отслеживать, как идут операции.   -  person tdelaney    schedule 20.04.2015


Ответы (2)


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

person MattDMo    schedule 20.04.2015
comment
Я уже сделал это, но я не мог понять, как получить файл после f.flush() - person Mahmoud Ksemtini; 20.04.2015
comment
Буферизация Python stdout определяется тем, подключен ли он к pty. OP заменяет stdout открытым файлом, и это открытый файл, а не исходный stdout, который буферизован. Тем не менее, куда OP должен помещать флеши? - person tdelaney; 20.04.2015
comment
Я ставил флеши в сервисы, которые вызываются функцией координатора, но после этого я не знал, как повторно получить файл - person Mahmoud Ksemtini; 20.04.2015

Наконец-то я нашел то, что искал здесь:

http://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent

Поэтому я создал WebSocket между серверной частью (Python/Flask) и внешней частью (HTML, jquery), чтобы обеспечить непрерывную связь.

И с помощью Python я создал поток, который работает асинхронно с основным потоком, повторно извлекает содержимое файла журнала и отправляет их в Jquery через ajax.

person Mahmoud Ksemtini    schedule 04.05.2015