Python:将各个输出部分重定向到单独的变量

我正在尝试创建一种机制将输出重定向print到多个变量。以下代码模拟了我正在寻找的内容:-


import sys

import io


class MultiOut(object):

    def __init__(self, stream_out):

        self.terminal = sys.stdout

        self.output = stream_out

    def write(self, message):

        self.terminal.write(message)

        self.output.write(message)

    def flush(self):

        self.terminal.flush()

        self.output.flush()


vals = {'a1': io.StringIO(), 'a2': io.StringIO(), 'a3': io.StringIO()}


for i,val in enumerate(vals):

    sys.stdout = MultiOut(vals[val])

    [print(x**i, end=' ') for x in range(11)]

    print("\n")


with open('temp.txt', 'w') as f:

    for x in vals:

        f.write(f"{x} :-\n")

        f.write(vals[x].getvalue())

        f.write(f"{'='*50}\n")

文件输出(tmp.txt):-


a1 :-

1 1 1 1 1 1 1 1 1 1 1 


0 1 2 3 4 5 6 7 8 9 10 


0 1 4 9 16 25 36 49 64 81 100 


==================================================

a2 :-

0 1 2 3 4 5 6 7 8 9 10 


0 1 4 9 16 25 36 49 64 81 100 


==================================================

a3 :-

0 1 4 9 16 25 36 49 64 81 100 


==================================================

我在这里想做的是将输出的各个“部分”重定向到不同的变量vals - a1, a2, a3并将所有输出转储到终端。奇怪的是,每个连续变量都包含从该点开始直到结束的数据。有没有办法避免这个问题并将每个部分保存在不同的变量中?


一只萌萌小番薯
浏览 64回答 1
1回答

慕田峪7331174

问题是您正在用您的对象替换 sys.stdout :sys.stdout = MultiOut(vals[val])在你的对象初始化中,你将 sys.stdout 设置为对象属性self.terminal = sys.stdout在第二次迭代时,执行此语句时self.terminal = sys.stdoutsys.stdout 是第一次迭代的替换,其中包括第一个MultiOut对象。我希望这是有道理的。我会使用日志记录模块来实现您想要的,而不是修改标准输出。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python