防止函数在批处理控制台打印
嗯,标题看起来已经说得很清楚了。
我在用一些函数,这些函数在某些时候会在控制台上打印一些东西。
因为我不能修改这些函数,所以我想知道有没有办法在使用这些函数的时候不让它们打印内容。
6 个回答
7
另一种选择是把你的函数放在一个装饰器里。
from contextlib import redirect_stdout
from io import StringIO
class NullIO(StringIO):
def write(self, txt):
pass
def silent(fn):
"""Decorator to silence functions."""
def silent_fn(*args, **kwargs):
with redirect_stdout(NullIO()):
return fn(*args, **kwargs)
return silent_fn
def nasty():
"""Useful function with nasty prints."""
print('a lot of annoying output')
return 42
# Wrap in decorator to prevent printing.
silent_nasty = silent(nasty)
# Same output, but prints only once.
print(nasty(), silent_nasty())
9
Constantinius的回答是可以的,不过其实并不需要真的打开一个空设备。顺便提一下,如果你想要一个可以在不同环境下都能用的空设备,可以使用os.devnull
。
实际上,你只需要一个可以忽略你写入内容的类。所以更通用的版本可以是:
class NullIO(StringIO):
def write(self, txt):
pass
sys.stdout = NullIO()
my_nasty_function()
sys.stdout = sys.__stdout__
.
44
是的,你可以改变 sys.stdout
的输出方向:
import sys
import os
old_stdout = sys.stdout # backup current stdout
sys.stdout = open(os.devnull, "w")
my_nasty_function()
sys.stdout = old_stdout # reset old stdout
只需要把 my_nasty_function
替换成你实际要用的函数就可以了。
更新:现在在Windows上也可以正常工作了。
更新:使用备份变量来重置stdout会更好,这样当有人再次调用你的函数时就不会出问题。