Могу ли я перенаправить свои операторы печати на несколько выходов без изменения всего кода? - PullRequest
0 голосов
/ 18 февраля 2019

Я знаю, что могу перенаправить операторы печати в файл: import sys sys.stdout = open ("log.txt", "w")

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Да, вы можете перенаправить свой код на столько файлов, сколько хотите, а также на CLI одновременно.Необходимо ввести новый класс для переопределения существующего метода записи.Попробуйте следующий фрагмент, он работает для меня:

import sys

class MultiPrinter(object):
    def __init__(self, *targets):
        self.targets = targets
    def write(self, obj):
        for f in self.targets:
            f.write(obj)
            f.flush()

f = open('logs.txt', 'w')
f1 = open('logs1.txt', 'w')
f2 = open('logs2.txt', 'w')
sys_org = sys.stdout
sys.stdout = MultiPrinter(sys_org, f, f1, f2)
print('First Statement.....')
print('Another Statement....')
0 голосов
/ 18 февраля 2019

Вы можете использовать этот ответ: Как перенаправить подпроцесс python stderr и stdout в несколько файлов?

Основная идея заключается в создании объекта с несколькими выходными данными и назначении егодо sys.stdout.

import sys

class MultiOut(object):
    def __init__(self, *args):
        self.handles = args

    def write(self, s):
        for f in self.handles:
            f.write(s)

with open('q1', 'w') as f1, open('q2', 'w') as f2, open('q3', 'w') as f3:
    # add all the files (including sys.stdout) to which the output should be written
    sys.stdout = MultiOut(f1, f2, sys.stdout)
    for i, c in enumerate('abcde'):
        print(c, 'out')
        print(i, 'err')
...