如何从功能中实时捕获打印件?
How to capture prints in real time from function?
我想捕获所有 print
并执行类似 return 的操作,但保留 运行 功能。
我找到了这个方法,但是当代码完成时它只 returns print
s。
f = io.StringIO()
with redirect_stdout(f):
# my code
return f.getvalue()
有什么方法可以实时捕捉每个print
吗?
您可以编写自己的 file-like 对象来处理它看到的文本行。在最简单的情况下,您只需要提供一个 write
方法,如下所示。棘手的部分是知道“打印”调用何时完成。 print
可能多次调用 stdout.write
来执行单个打印操作。在此示例中,每当看到换行符时我都会进行处理。此代码不会 return 临时打印,但允许您拦截对 stdout 的写入并在 return 调用 print 的函数之前对其进行处理。
from contextlib import redirect_stdout
import sys
real_stdout_for_test = sys.stdout
class WriteProcessor:
def __init__(self):
self.buf = ""
def write(self, buf):
# emit on each newline
while buf:
try:
newline_index = buf.index("\n")
except ValueError:
# no newline, buffer for next call
self.buf += buf
break
# get data to next newline and combine with any buffered data
data = self.buf + buf[:newline_index + 1]
self.buf = ""
buf = buf[newline_index + 1:]
# perform complex calculations... or just print with a note.
real_stdout_for_test.write("fiddled with " + data)
with redirect_stdout(WriteProcessor()):
print("hello there")
print("a\nprint\nof\nmany\nlines")
print("goodbye ", end="")
print("for now")
我想捕获所有 print
并执行类似 return 的操作,但保留 运行 功能。
我找到了这个方法,但是当代码完成时它只 returns print
s。
f = io.StringIO()
with redirect_stdout(f):
# my code
return f.getvalue()
有什么方法可以实时捕捉每个print
吗?
您可以编写自己的 file-like 对象来处理它看到的文本行。在最简单的情况下,您只需要提供一个 write
方法,如下所示。棘手的部分是知道“打印”调用何时完成。 print
可能多次调用 stdout.write
来执行单个打印操作。在此示例中,每当看到换行符时我都会进行处理。此代码不会 return 临时打印,但允许您拦截对 stdout 的写入并在 return 调用 print 的函数之前对其进行处理。
from contextlib import redirect_stdout
import sys
real_stdout_for_test = sys.stdout
class WriteProcessor:
def __init__(self):
self.buf = ""
def write(self, buf):
# emit on each newline
while buf:
try:
newline_index = buf.index("\n")
except ValueError:
# no newline, buffer for next call
self.buf += buf
break
# get data to next newline and combine with any buffered data
data = self.buf + buf[:newline_index + 1]
self.buf = ""
buf = buf[newline_index + 1:]
# perform complex calculations... or just print with a note.
real_stdout_for_test.write("fiddled with " + data)
with redirect_stdout(WriteProcessor()):
print("hello there")
print("a\nprint\nof\nmany\nlines")
print("goodbye ", end="")
print("for now")