python - 如何使用 `with` 语句来抑制 `sys.stdout` 或 `sys.stderr`?
问题描述
我试图用一个with
声明来压制sys.stdout
或sys.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
解决方案
我使用以下一个:
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
推荐阅读
- verilog - 将 1111 补码到有符号数 0000
- ssl - 使用 Nginx-Ingress-Controller 在 AWS 上的 EKS 中使用 gRPC
- amazon-web-services - 尝试限制对 AWS 中特定 Lambda 的访问时条件键无效
- java - 在一个实体中使用多个关系(一对一和一对多)时的异常
- sql - 增量负载
- c# - C# GearVR 数据包解密
- html - 静态 HTML 最终用户 CMS?
- python - 如何使用一个工作簿中的列,遍历另一个工作簿并将相应的数据复制到
- design-patterns - 微服务上需要事务性发件箱模式
- android - React native expo Android 模拟器未呈现 uri 图像