Оболочка для записи в несколько потоков - PullRequest
3 голосов
/ 03 февраля 2012

Есть ли в python простой способ настроить файлоподобный объект для записи, который фактически поддерживается несколькими выходными потоками?Например, я хочу что-то вроде этого:

file1 = open("file1.txt", "w")
file2 = open("file2.txt", "w")
ostream = OStreamWrapper(file1, file2, sys.stdout)

#Write to both files and stdout at once:
ostream.write("ECHO!")

Так что я ищу это OStreamWrapper.Я знаю, что было бы довольно легко написать свой собственный, но если он существует, я бы предпочел использовать его и не беспокоиться о поиске и рассмотрении крайних случаев.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012
class OStreamWrapper(object):

    def __init__(self, *streams):
        self.streams = list(streams)

    def write(self, string):
        for stream in self.streams:
            stream.write(string)

    def writelines(self, lines):
        # If you want to use stream.writelines(), you have
        # to convert lines into a list/tuple as it could be
        # a generator.
        for line in lines:
            for stream in self.streams:
                stream.write(line)

    def flush(self):
        for stream in self.streams:
            stream.flush()
2 голосов
/ 03 февраля 2012

Способ обернуть все публичные file функции:

import sys

def _call_for_all_streams(func_name):
    def wrapper(self, *args, **kwargs):
        result = []
        for stream in self._streams:
            func = getattr(stream, func_name)
            result.append(func(*args, **kwargs))
        return result
    return wrapper

class OStreamWrapper(object):
    def __init__(self, *streams):
        self._streams = streams

for method in filter(lambda x: not x.startswith('_'), dir(file)):
    setattr(OStreamWrapper, method, _call_for_all_streams(method))

if __name__ == '__main__':
    file1 = open("file1.txt", "w")
    file2 = open("file2.txt", "w")
    ostream = OStreamWrapper(file1, file2, sys.stdout)
    ostream.write("ECHO!")
    ostream.close()

Но это немного грязно.

0 голосов
/ 03 февраля 2012

Бортовой журнал - еще один вариант, хотя и более тогоЕго обработчики более мощные, и вы можете комбинировать все, что захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...