首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python拦截stdout,听流写入,实时捕获stdout。

Python拦截stdout,听流写入,实时捕获stdout。
EN

Stack Overflow用户
提问于 2022-11-17 19:39:29
回答 1查看 13关注 0票数 0

我想在它出现的时候抓住它,每当它被写到的时候,我都会做出反应。我没能找到像"io流-写侦听器“之类的东西。

我怎么才能重定向现场直播?现在我已经

代码语言:javascript
复制
import sys
import time

from io import IOBase, StringIO


class Tee:
    def __init__(self, target: IOBase):
        self._stdout = sys.stdout
        self.target = target

    def __enter__(self):
        sys.stdout = self.target

    def __exit__(self, *args, **kwargs):
        sys.stdout = self._stdout
        copy_here.seek(0)
        for line in copy_here.readlines():
            print(line, end='')
        copy_here.seek(0)


if __name__ == '__main__':
    copy_here = StringIO()
    with Tee(copy_here):
        print('one')
        print('two')
        time.sleep(1)
        print('three')
    print(copy_here.getvalue())

但是这会导致所有的打印输出被缓冲,直到上下文退出,最后它们被打印出来。

相反,我希望输出在出现时打印为stdout,同时被复制到流中。

EN

回答 1

Stack Overflow用户

发布于 2022-11-17 21:36:41

最后,我提出了在实际目标流周围创建一个包装器流的想法,即在拦截它们之后传递方法调用,然后先将它们打印到stdout。

这似乎很管用。

代码语言:javascript
复制
import sys
import time

from io import IOBase, StringIO
from types import SimpleNamespace


class Tee:
    def __init__(self, target: IOBase):
        self._stdout = sys.stdout
        self.target = target
        self.wrapped_target = SimpleNamespace()
        for method in filter(lambda x: not x.startswith('_'), dir(sys.stdout)):
            setattr(self.wrapped_target, method, self._wrapped_method(method))

    def _wrapped_method(self, stdout_method):
        def wrapped_method(*args, **kwargs):
            getattr(self.target, stdout_method)(*args, **kwargs)
            return getattr(self._stdout, stdout_method)(*args, **kwargs)
        return wrapped_method


    def __enter__(self):
        sys.stdout = self.wrapped_target

    def __exit__(self, *args, **kwargs):
        sys.stdout = self._stdout


if __name__ == '__main__':
    copy_here = StringIO()
    with Tee(copy_here):
        print('one')
        print('two')
        time.sleep(1)
        print('three')
    print(copy_here.getvalue())

但对于一个非常简单的问题来说,这似乎太过分了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74481204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档