Перенаправление всего вывода файла python на tinydb

У меня есть сценарий Python, который состоит из нескольких работающих потоков, и у них есть распечатки, чтобы сообщить о любой ошибке подключения, например, не удалось открыть порты, не удалось подключиться и т. Д.

Я попробовал основные:

import sys
sys.stdout = open('file', 'w')

но ничего не было сохранено в файл. Я пытаюсь получить выходные данные системных распечаток и сохранить их в tinydb. Я пытаюсь войти все выходы в tinydb. Как я могу это сделать?

Можно ли просто извлекать все выходные данные печати непрерывно и сохранять их в файл json с помощью tinydb?

1 ответ

В python3 вы должны использовать print с аргументом файла, если вы хотите переопределить стандартный вывод, как сказано в документации и как задокументировано в этом вопросе:

Python 2.7: печать в файл

Это дает вам основной строительный блок для достижения того, что вы ищете. Вы ничего не объясняете о том, как вы собираетесь использовать это с tinydb...

Тем не менее, ваш вызов печати должен выглядеть следующим образом:

fake_stdout = open('file', 'w')
print(data, file=fake_stdout)

Вот и все.

Если по каким-либо причинам у вас есть много операторов печати, которые вы можете изменить, вы можете сделать что-то вроде этого:

Иметь модуль с локальной переменной потока, которая инициализируется. Вот посмотрите на этот вопрос: Поток локального хранилища в Python

Затем, когда у вас настроен модуль, вы можете добавить это утверждение во все ваши файлы, для которых требуется другой вывод на печать.

from special_print import local_print as print

Все, что вам нужно сделать, это определить переменную threadlocal в вашем модуле special_print и затем определить ее, когда новый поток начинается с чего-то вроде этого:

def print_factory(fout):
    def local_print(arg):
        print(arg, file=fout)
    return local_print

В каждом новом потоке вы запускаете что-то вроде этого:

import special_print
special_print.local_print = print_factory(fake_stdout)

Затем, когда вы импортируете это print метод в каждом из ваших потоков, они будут правильно выводить данные в fake_stdout, который вы определили в каждом потоке.

Другие вопросы по тегам