因此,我使用的是第三方库中的 method_x,每次使用时都会打印警告。由于我正在编写一些旨在从 cli 获取用户输入的内容,因此我想阻止这种烦人的打印。
import module_x
module_x.method_x() # Has expected behaviour but prints an annoying warning
Run Code Online (Sandbox Code Playgroud)
我可以做些什么来阻止函数内的所有打印语句?也许用一些东西包装方法或暂时禁用标准输出?
编辑:我最终使用了日志模块的一种方法来捕获警告并将它们重定向到日志文件。这是我制作的装饰器:
logging.basicConfig(filename='log/log', level=logging.WARNING)
class redirect_warnings_to_log(object):
def __init__(self, f):
self.f = f
def __call__(self, args):
logging.captureWarnings(True)
self.f(args)
logging.captureWarnings(False)
Run Code Online (Sandbox Code Playgroud)
这是打印警告的装饰方法:
@redirect_warnings_to_log
def tweet(message):
twt = api.PostUpdate(message)
Run Code Online (Sandbox Code Playgroud)
正如问题所说 -
我正在使用来自第三方库的 method_x,每次使用它都会打印警告。
如果method_x正在使用 Python 的warnings模块。然后您可以使用warnings.catch_warnings()withwith语句并warnings.simplefilter()忽略警告,从而抑制警告。
例子 -
>>> import warnings
>>> def f():
... warnings.warn("Some warning!")
...
>>> f()
__main__:2: UserWarning: Some warning!
>>> with warnings.catch_warnings():
... warnings.simplefilter("ignore")
... f()
...
Run Code Online (Sandbox Code Playgroud)
请注意,这只是暂时抑制警告,仅在with块内,在 f() 用于if块外,然后它不会抑制这些警告。
从文档 -
而在上下文管理器中,所有警告都将被忽略。这允许您使用已知已弃用的代码而不必查看警告,同时不会抑制其他可能不知道其使用已弃用代码的代码的警告。注意:这只能在单线程应用程序中得到保证。如果两个或多个线程同时使用 catch_warnings 上下文管理器,则行为未定义。