自定义打印功能从子功能产生

时间:2018-03-26 19:35:22

标签: python python-3.x

我自定义打印功能以打印到控制台,并将打印线发送到对象,这样我就可以使用yield函数将它们传送到gui。这很好用,直到我的函数调用子函数并且子函数打印到控制台。如果我将自定义打印导入到该子功能中,它不起作用,因为该打印产生的结果是子功能,而不是原始的外部功能。

有没有办法将我的自定义打印结果直接返回主函数并跳过这个真正的噩梦?

from __future__ import print_function
import __builtin__

def print(*args, **kwargs):
    import builtins
    import io
    from contextlib import redirect_stdout
    builtins.print(*args, **kwargs)
    with io.StringIO() as buf, redirect_stdout(buf):
        builtins.print(*args, **kwargs)
        output = buf.getvalue()
    return output

1 个答案:

答案 0 :(得分:2)

创建一个在写入时写入两个不同文件的对象,而不是覆盖print。像

这样的东西
# I'm not sure if there are other methods you should override, but
# they would be similar.
class Delegator(io.TextIOBase):
    def __init__(self, fh1, fh2):
        self.fh1 = fh1
        self.fh2 = fh2

    def write(self, txt):
        self.fh1.write(txt)
        self.fh2.write(txt)

    def flush(self):
        self.fh1.flush()
        self.fh2.flush()

sys.stdout = Delegator(sys.stdout, my_other_file)