嗯,在我看来,这个标题就足够了。 我使用一些函数在某些时候在控制台中打印一些内容。 由于我无法修改它们,我想知道是否有解决方案在使用这些功能时不打印。
是的,您可以重定向
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 上工作。
编辑:当有人再次包装你的函数时,使用备份变量重置标准输出会更好
Constantinius的答案答案是可以的,但是不需要实际打开空设备。顺便说一句,如果你想要便携式零设备,有
os.devnull
。
实际上,您所需要的只是一个类,它将忽略您写入的任何内容。所以更便携的版本是:
class NullIO(StringIO):
def write(self, txt):
pass
sys.stdout = NullIO()
my_nasty_function()
sys.stdout = sys.__stdout__
.
另一种选择是将函数包装在装饰器中。
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())
您可以使用此answer的修改版本来创建一个“空”输出上下文来包装函数的调用。
os.devnull
作为 new_stdout
参数传递给 stdout_redirected()
上下文管理器函数来完成。
Constantinius 的解决方案将在 *nix 上运行,但这应该在任何平台上运行:
import sys
import tempfile
sys.stdout = tempfile.TemporaryFile()
# Do crazy stuff here
sys.stdout.close()
#now the temp file is gone
sys.stdout = sys.__stdout__
Constantinius 目前接受的答案在大多数情况下都效果很好,但在 Jupyter 笔记本中则不然。 以下是如何让它工作(使用可重用的功能)...
TLDR~不要使用sys.__stout__
,而是备份
sys.stdout
并稍后恢复。在 Jupyter 笔记本中,运行
sys.stdout == sys.__stdout__
将返回 false。这是因为每个单元都有一个单独的输出流(而不是一个终端实例,即
sys.__stdout__
)。 因此,对于使用 Jupyter Notebook 的每个人来说,请务必备份旧的
sys.stdout
路径并在之后恢复。 这是它的一个函数:
import sys, os
def deafen(function, *args):
real_stdout = sys.stdout
sys.stdout = open(os.devnull, "w")
output = function(*args)
sys.stdout = real_stdout
return output
将函数及其参数传递给 deafen
(
args
)。它会备份旧的
sys.stdout
,切换到
os.devnull
,然后再次返回。对于完整的示例,我们可以创建第二个函数 (
test_function
):
def test_function(first_argument, second_argument, *args):
print(first_argument)
print(second_argument)
print(args)
现在,如果我们尝试像平常一样使用 test_function
(也称为不使用
deafen
),我们将在屏幕上打印出一堆输出:
print("Printing should work fine here")
test_function(32, 12, 1, 32, 1)
但是,当使用deafen
时,我们不会得到新的输出:
print("That'll be the last thing you see...")
deafen(test_function, 32, 12, 1, 32, 1)
顺便说一句,deafen
函数仍然返回函数输出。您还可以将
deafen
与
sys.__stdout__
一起使用,只需将
sys.stdout = real_stdout
替换为
sys.stdout = sys.__stdout__
(也可以在使用时删除
real_stdout = sys.stdout
)。希望能够帮助任何正在寻找稍微更强大或更灵活的解决方案的人(可能适用于 Jupyter 笔记本,或与多种功能一起使用)!