Within contextlib.redirect_stdout() the print()-function causes an AttributeError: 'str' object has no attribute 'write'

Within contextlib.redirect_stdout() the print()-function causes an AttributeError: 'str' object has no attribute 'write'

我尝试按照 this post 的建议将我的 python 代码特定部分的整个控制台输出重定向到文本文件。

根据 post,它应该与 contextlib.redirect_stdout() 一起工作,但是 当第一个 print() 命令出现时 在我的自定义函数中custom_function_with_internal_print_calls(),它抛出 AttributeError: 'str' object has no attribute 'write'.

dummy_file = "dummy_textfile.txt"  # file to which the stdout shall be redirected

with contextlib.redirect_stdout(dummy_file):
    # Direct print()-function call
    print("Informative string which shall go to the textfile instead of the console.")

    # Indirect print()-function calls (internally)
    custom_function_with_internal_print_calls(**kwargs)

编辑: 在我的特殊情况下,我有一个自定义函数,而不是 with 环境中的 print() 函数,它具有对 Python 的内置 print() 函数的内部调用。 print() 函数是否出现在另一个函数中,或者直接出现在顶层以重现错误应该无关紧要。

已经尝试过的选项: 其他解决方法似乎无法提供我正在寻找的解决方案,例如

redefining the print()-function

writing a decorator for python 2.7x(因为我使用的是 python 3.7x), 或者也

redirecting the print()-function to a file object 通过 print('Filename:', filename, file=f)。 在我的例子中,后者意味着将文件处理程序传递给我选择的封闭函数中的所有子函数,这对于这种特殊情况来说是太多的额外代码修改。

我希望能够只使用围绕我的函数的环境 with contextlib.redirect_stdout(dummy_file):,以便将这个函数的每个控制台输出重定向到 dummy_file.

documentation of contextlib.redirect_stdout() 对我也没有帮助。 在此先感谢您的建议。

我通过将 文件处理程序 "f" 传递给函数 contextlib.redirect_stdout(f) 而不是文件路径 [=20] 找到了解决方案=] dummy_file,建议in this post.

dummy_file = "dummy_textfile.txt"  # file to which the stdout shall be redirected

with open(dummy_file, 'w') as f:
    with contextlib.redirect_stdout(f):
        # Indirect print()-function calls (internally)
        custom_function_with_internal_print_calls(**kwargs)

这样,所有 print() 函数调用都会写入 dummy_file 并随后恢复标准控制台输出。