Перенаправление всего вывода файла python на tinydb
У меня есть сценарий Python, который состоит из нескольких работающих потоков, и у них есть распечатки, чтобы сообщить о любой ошибке подключения, например, не удалось открыть порты, не удалось подключиться и т. Д.
Я попробовал основные:
import sys
sys.stdout = open('file', 'w')
но ничего не было сохранено в файл. Я пытаюсь получить выходные данные системных распечаток и сохранить их в tinydb. Я пытаюсь войти все выходы в tinydb. Как я могу это сделать?
Можно ли просто извлекать все выходные данные печати непрерывно и сохранять их в файл json с помощью tinydb?
1 ответ
В python3 вы должны использовать print
с аргументом файла, если вы хотите переопределить стандартный вывод, как сказано в документации и как задокументировано в этом вопросе:
Это дает вам основной строительный блок для достижения того, что вы ищете. Вы ничего не объясняете о том, как вы собираетесь использовать это с 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, который вы определили в каждом потоке.