如何将stdout重定向到文件和`sys .__ stdout__`?

时间:2017-10-22 00:54:06

标签: python file stdout

以下行将stdoutsys.__stdout__更改为文件。这很好。

import sys
sys.stdout = open("stdout.txt", "a")
print("test")

但是,我希望输出到文件以及sys.__stdout__。我需要添加什么才能将"test"写入两者?

3 个答案:

答案 0 :(得分:2)

您可以创建自己的文件类对象,write方法将数据发送到这两个位置并将其安装为sys.stdout

答案 1 :(得分:1)

你可以做这样的事情来保持简单并避免修改sys.stdout

import sys

my_log = open('log.txt', 'a')

def write_out(data):
    print(data, file=sys.stdout)
    my_log.write(data + '\n')

def write_err(data):
    print(data, file=sys.stderr)
    my_log.write(data + '\n')

def main():
    write_out('test out')
    write_err('test err')

答案 2 :(得分:1)

可以使用<td>...</td>函数“拦截”对sys.stdout.write的调用,该函数将文本写入文件并随后调用原始的mock_write函数。

real_write

注意:这不太可能,但是如果import sys def mock_write(text): with open("test.txt", "a") as fh: fh.write(text) real_write = type(sys.stdout).write real_write(sys.stdout, text) sys.stdout.write = mock_write print("TEST") 的原始write方法被更改并且与我们的不兼容,则此解决方案可能无法与将来的Python版本一起使用。模拟功能。

此外,这种用另一个函数替换对象的现有方法的方法也有其局限性:例如,它不适用于魔术方法和sys.stdout。例如,请参见Adding a Method to an Existing Object Instance,以了解更多信息。