2014-10-13 2 views
-1

Я хотел бы, чтобы stdout и stderr были перенаправлены в тот же файл, в то время как stderr все еще записывает на экран. Какой самый питонический способ сделать это?Перенаправление stdout, stderror в файл, в то время как stderr все еще печатает на экран

+0

Вы имеете в виду текущую программу или подпроцесс? – abarnert

+0

@abarnert yes, текущая программа, а не подпроцесс –

ответ

1

Я предполагаю, что вы хотите перенаправить stdout текущего сценария и stderr, а не какой-то подпроцесс, который вы используете.

Это не звучит как очень вещий, что нужно сделать в первую очередь, но если вам нужно, решение Pythonic будет:

  • Перенаправление stdout в файл.
  • Переадресовать stderr в специальный файл-подобный объект, который записывает в файл, а также записывает в реальный stderr.

Что-то вроде этого:

class Tee(object): 
    def __init__(self, f1, f2): 
     self.f1, self.f2 = f1, f2 
    def write(self, msg): 
     self.f1.write(msg) 
     self.f2.write(msg) 

outfile = open('outfile', 'w') 

sys.stdout = outfile 
sys.stderr = Tee(sys.stderr, outfile) 
0

Лучше всего, чтобы use the python logging framework для отправки сообщений в обоих местах, а не на самом деле перенаправляет стандартный вывод/STDERR. В качестве менее пифонической альтернативы, you could make a custom file-like object that's write method will write to both sys.__stdout__ and your file и присвойте sys.stdout свой пользовательский объект. Затем вы сделаете то же самое для stderr. См. documentation for the sys module

+0

Нет, у вас все еще есть 'stderr' для записи на экран. (Не говоря уже о 'sys .__ stdout__' и' sys .__ stderr__'.) И, конечно же, вы всегда можете сохранить исходный 'stdout' перед перенаправлением. – abarnert

+0

Он также хочет перенаправить stderr. Вы правы насчет sys.stdout vs sys .__ stdout__, я обновлю свой ответ, чтобы включить это: – ErlVolton

+0

Да, он хочет перенаправить stderr, чтобы он записывал в файл и в реальный 'stderr'. И абсолютно ничего не мешает ему сделать это; Я не знаю, почему вы думаете, что это будет проблемой. Между тем, он не хочет, чтобы 'stdout' шел на экран, только в файл, так почему вы объясняете, как это сделать? – abarnert

Смежные вопросы