阻止Python模块打印

时间:2017-03-22 13:10:27

标签: python console

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

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

er = e_r.EventRegistry(apiKey="1234")

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

using user provided API key for making requests
Event Registry host: http://eventregistry.org

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

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

E.g。

er = stopPrint(e_r.EventRegistry(apiKey="1234"))

2 个答案:

答案 0 :(得分:2)

无需编辑模块,您可以暂停一下stdout。

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")

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

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 = supressOutput(e_r.EventRegistry)

#As many time as I want, stdout should always be supressed. 
e_r.EventRegistry(apiKey="1234")
e_r.EventRegistry(apiKey="1234")
e_r.EventRegistry(apiKey="1234")
e_r.EventRegistry(apiKey="1234")

对于解决方案的三分之一,这里是基于上下文管理器的方法!!

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 supressStream(sys.stderr):
    e_r.EventRegistry(apiKey="1234")

答案 1 :(得分:0)

这样做的一种方法就是编辑模块本身。只需打开EventRegistry.py并删除

即可
if apiKey:
    print("using user provided API key for making requests")

print("Event Registry host: %s" % (self._host))

代码行。然后,您可能需要使用setup.py重新安装该模块。