以下行将stdout
从sys.__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__
。有关进一步阅读,请参阅向现有对象实例添加方法。