我希望捕获具有多个调试打印函数的函数的输出,然后将输出保存到一个文件中。我需要一种pythonic方式来实现这一点(我不能使用python script.py > out.txt
)
例如,我可能有一段表单代码:
import SomeClass
my_class = SomeClass()
for i in range(0, 9999):
result = my_class.function_to_test(some_variable=i)
*do something else with the result*
我想要从function_to_test
捕获打印的调试输出语句。(注意:实际上,打印输出不是简单的for
循环更改变量的结果)。
在How to capture stdout output from a Python function call?中,我尝试使用:
import SomeClass
class Capturing(list):
def __enter__(self):
self._stdout = sys.stdout
sys.stdout = self._stringio = StringIO()
return self
def __exit__(self, *args):
self.extend(self._stringio.getvalue().splitlines())
del self._stringio # free up some memory
sys.stdout = self._stdout
my_class = SomeClass()
for i in range(0, 9999):
with Capturing() as output:
result = my_class.function_to_test(some_variable=i)
with open(str(i), "w") as f:
f.write(output)
然而,这在我的情况下不起作用。我也不希望每一行都存储为列表(我认为这会破坏打印输出的外观)。再说一次,我不能简单地做python script.py > out.txt
。原因之一是,真正的计算是并行运行的,输出结果是杂乱无章的。
如何将function_to_test
的输出保存到文件中?
发布于 2021-03-30 14:55:23
首先创建一个对象,它将使用write方法存储您的输出:
class EmittingStream:
def __init__(self, path_logs):
self.path_logs = path_logs
def write(self, text):
f = open(self.path_logs, "a")
f.write(text)
f.close()
然后将这个类与stdout关联:
sys.stdout = EmittingStream("my/path/to/logs.txt")
下面是一个完整的带有装饰器的小型示例:
def logger(f):
class EmittingStream:
def __init__(self, path_logs):
self.path_logs = path_logs
def write(self, text):
f = open(self.path_logs, "a")
f.write(text)
f.close()
def wrapper(*args, **kwargs):
save_std_out = sys.stdout
sys.stdout = EmittingStream(os.path.join(dir, "test.txt"))
res = f()
sys.stdout = save_std_out
return res
return wrapper
@logger
def f():
print("ok")
if __name__ == "__main__":
f()
这并不是说您应该保存默认的std_out以便在之后恢复它。
https://stackoverflow.com/questions/66873286
复制相似问题