首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python:捕获并保存函数输出

Python:捕获并保存函数输出
EN

Stack Overflow用户
提问于 2021-03-30 14:49:31
回答 1查看 50关注 0票数 0

我希望捕获具有多个调试打印函数的函数的输出,然后将输出保存到一个文件中。我需要一种pythonic方式来实现这一点(我不能使用python script.py > out.txt)

例如,我可能有一段表单代码:

代码语言:javascript
运行
AI代码解释
复制
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?中,我尝试使用:

代码语言:javascript
运行
AI代码解释
复制
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的输出保存到文件中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-30 14:55:23

首先创建一个对象,它将使用write方法存储您的输出:

代码语言:javascript
运行
AI代码解释
复制
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关联:

代码语言:javascript
运行
AI代码解释
复制
sys.stdout = EmittingStream("my/path/to/logs.txt")

下面是一个完整的带有装饰器的小型示例:

代码语言:javascript
运行
AI代码解释
复制
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以便在之后恢复它。

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

https://stackoverflow.com/questions/66873286

复制
相关文章

相似问题

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