停止打印 Python 模块

Lew*_*son 1 python console

我正在使用一个名为 eventregistry 的模块,它是一个用于使用外部 API 的工具包。

当与服务器建立连接时,我在他们的模块上调用这个方法(作为 e_r 导入)。

er = e_r.EventRegistry(apiKey="1234")
Run Code Online (Sandbox Code Playgroud)

然后模块方法在内部打印:

using user provided API key for making requests
Event Registry host: http://eventregistry.org
Run Code Online (Sandbox Code Playgroud)

这只会阻塞我的控制台,当我的数据源之一抛出错误时,我只想打印它。我正在向这个数据源发出多个请求,它在控制台中真的变得非常混乱!

有没有人知道某种“stopPrint()”函数,它允许我调用方法和运行函数,但停止它们打印到控制台?

例如

er = stopPrint(e_r.EventRegistry(apiKey="1234"))
Run Code Online (Sandbox Code Playgroud)

gbt*_*mon 5

无需编辑模块,您可以暂时重新路由标准输出。

import sys
import os

def stopPrint(func, *args, **kwargs):
    with open(os.devnull,"w") as devNull:
        original = sys.stdout
        sys.stdout = devNull
        func(*args, **kwargs)
        sys.stdout = original 

stopPrint(e_r.EventRegistry,apiKey="1234")
Run Code Online (Sandbox Code Playgroud)

更好的是,您可以通过使用类似于装饰器模式的东西用包装版本替换方法来注册一个被抑制的函数。

def suppressOutput(func):
    def wrapper(*args, **kwargs):
        with open(os.devnull,"w") as devNull:
            original = sys.stdout
            sys.stdout = devNull
            func(*args, **kwargs)
            sys.stdout = original
    return wrapper

e_r.EventRegistry = suppressOutput(e_r.EventRegistry)

# As many times as I want, stdout should always be suppressed. 
e_r.EventRegistry(apiKey="1234")
e_r.EventRegistry(apiKey="1234")
e_r.EventRegistry(apiKey="1234")
e_r.EventRegistry(apiKey="1234")
Run Code Online (Sandbox Code Playgroud)

而对于这里的解决方案的三重奏是基于上下文管理器的方法!

from contextlib import contextmanager
import sys
import os

@contextmanager
def suppressStream(stream):
    with open(os.devnull, "w") as devNull:
        orig = stream
        stream = devNull
        try:  
            yield
        finally:
            stream = orig

with suppressStream(sys.stdout):
    e_r.EventRegistry(apiKey="1234")

with suppressStream(sys.stderr):
    e_r.EventRegistry(apiKey="1234")
Run Code Online (Sandbox Code Playgroud)