Python для автоматического сброса stdout и stderr в локальный текстовый файл во время выполнения - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть скрипт Python для постоянного мониторинга различных датчиков.Периодически мой скрипт Python использует операторы print ().

Моя цель - чтобы мой скрипт Python отправлял stdout и stderr в файл в режиме реального времени.

Myтекущее решение основано на следующих двух ответах:

Вот мой текущий код:

from contextlib import redirect_stdout, redirect_stderr
from os.path import join
from some_other_package import get_base_logging_path  # returns filepath (str)

def main():
    stdout_log_path = join(get_base_logging_path(), "stdout.txt")
    stderr_log_path = join(get_base_logging_path(), "stderr.txt")
    with open(stdout_log_path, 'w') as f1, redirect_stdout(f1), \
        open(stderr_log_path, 'w') as f2, redirect_stderr(f2):
            do_stuff()

Здесь я перехожу к переполнению стека: файлы stdout.txt и stderr.txt находятсяизменяется только когда скрипт либо выдает ошибку, либо я благополучно закрываю его с помощью control-C.

. Я бы хотел (особенно stdout.txt) обновляться каждый раз, когда в моем коде Python выполняется новый оператор print(),Как сделать так, чтобы моя программа автоматически сбрасывала stdout и stderr в текстовый файл?

Примечание. Я попытался python -u, но он не работает.

1 Ответ

1 голос
/ 25 апреля 2019

Установка для меня размера буфера файла 1 сработала для меня

from contextlib import redirect_stdout
import time
import sys

with open("foo.txt", "w", buffering=1) as handle:
    with redirect_stdout(handle):
        print("foo")
        time.sleep(30)
        print("bar")

также работало использование печати с ключевым словом flush

print("foobar", flush=True)

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

...