如何将标准输出重定向到文件和“sys.__stdout__”



以下行将stdoutsys.__stdout__更改为文件。这工作正常。

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

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

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

你可以

做这样的事情来保持简单并避免修改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')
可以使用

mock_write函数"拦截"对sys.stdout.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 sys.stdout方法发生变化并且与我们的模拟函数不兼容,此解决方案可能会停止与未来版本的 Python 一起使用。

此外,某些函数(例如subprocess.Popen)不使用sys.stdout.write而是直接写入文件对象的fileno文件描述符。因此,模拟写入不会捕获该输出。

顺便说一下,这种用另一个函数替换对象的现有方法的方法有其局限性:例如,它不适用于魔术方法和__slots__。有关进一步阅读,请参阅向现有对象实例添加方法。

最新更新