首页 > 解决方案 > 如何使用 `with` 语句来抑制 `sys.stdout` 或 `sys.stderr`?

问题描述

我试图用一个with声明来压制sys.stdoutsys.stderr单独。 我找到了一个不起作用的教程。我正在使用Python 3.6.4,我认为本教程是Python 2.

我在 SO 上查找了它,发现了一些但应用程序不起作用或不适用于这种情况。

这不适用:Python subprocess supress stdout 和 stderr

无法使任何with语句起作用: 从 Python 函数中抑制 stdout / stderr 打印

这适用于 fortran:在 Python 中重定向 FORTRAN(通过 F2PY 调用)输出

from contextlib import contextmanager
@contextmanager
def suppress_console(file=sys.stdout):
    with open(os.devnull, "w") as devnull:
        old_file = file
        file = devnull
        try:  
            yield
        finally:
            file = old_file

with suppress_console():
    print(1, file=sys.stdout)
# 1

标签: pythonstdoutstderrsuppressdev-null

解决方案


我使用以下一个:

from contextlib import redirect_stdout, contextmanager
import os


@contextmanager
def suppress():
    with open(os.devnull, "w") as null:
        with redirect_stdout(null):
            yield

测试:

print("qwer")
with suppress():
    print("asdf")
print("ghjk")
# qwer
# ghjk

更新

一个更好的:

from contextlib import redirect_stdout, redirect_stderr, contextmanager, ExitStack
import os

@contextmanager
def suppress(out=True, err=False):
    with ExitStack() as stack:
        with open(os.devnull, "w") as null:
            if out:
                stack.enter_context(redirect_stdout(null))
            if err:
                stack.enter_context(redirect_stderr(null))
            yield

推荐阅读