我想在它出现的时候抓住它,每当它被写到的时候,我都会做出反应。我没能找到像"io流-写侦听器“之类的东西。
我怎么才能重定向现场直播?现在我已经
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,同时被复制到流中。
发布于 2022-11-17 21:36:41
最后,我提出了在实际目标流周围创建一个包装器流的想法,即在拦截它们之后传递方法调用,然后先将它们打印到stdout。
这似乎很管用。
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())但对于一个非常简单的问题来说,这似乎太过分了。
https://stackoverflow.com/questions/74481204
复制相似问题