以下行将stdout
从sys.__stdout__
更改为文件。这很好。
import sys
sys.stdout = open("stdout.txt", "a")
print("test")
但是,我希望输出到文件以及sys.__stdout__
。我需要添加什么才能将"test"
写入两者?
答案 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,以了解更多信息。