嗯,标题似乎对我来说足够了。 我使用一些功能,在某些点打印控制台中的东西。 由于我无法修改它们,我想知道在使用这些功能时是否存在不打印的解决方案。
非常感谢!
尼科
答案 0 :(得分:27)
是的,您可以重定向sys.stdout
:
import sys
import os
sys.stdout = open(os.devnull, "w")
my_nasty_function()
sys.stdout = sys.__stdout__
只需将my_nasty_function
替换为您的实际功能。
编辑:现在应该在Windows上工作,并使用sys.__stdout__
而不是备份变量。
答案 1 :(得分:8)
Constantinius' answer回答没问题,但是没有必要实际打开null设备。顺便说一下,如果你想要便携式空设备,那就有os.devnull
。
实际上,你所需要的只是一个会忽略你写给它的东西的类。因此更便携的版本将是:
class NullIO(StringIO):
def write(self, txt):
pass
sys.stdout = NullIO()
my_nasty_function()
sys.stdout = sys.__stdout__
答案 2 :(得分:1)
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__
答案 3 :(得分:1)
您可以使用此answer的修改版本来创建“null”输出上下文来包装函数调用。
只需将os.devnull
作为new_stdout
参数传递给stdout_redirected()
上下文管理器函数,就可以完成。
答案 4 :(得分:1)
Constantinius当前接受的答案在大多数情况下都有效,但在Jupyter笔记本电脑中则不行。 这是使其(具有可重复使用的功能)正常工作的方法...
TLDR〜备份 在Jupyter笔记本中,运行 将函数及其参数/参数( 对于一个完整的示例,我们可以创建第二个函数( 现在,如果我们尝试像平常一样使用 但是,当使用 另一方面, 希望对正在寻求更健壮或灵活的解决方案的人有所帮助(可能适用于Jupyter笔记本,或具有多种功能)!sys.__stout__
而不是使用sys.stdout
,然后稍后将其还原。
sys.stdout == sys.__stdout__
返回false。这是因为每个单元都有一个单独的输出流(而不是一个终端实例sys.__stdout__
)。
因此,对于使用Jupyter笔记本电脑的每个人,请确保备份旧的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
时将其删除)。
答案 5 :(得分:0)
另一个打开方法是将你的函数包装在装饰器中。
import sys
from io import stringIO
class NullIO(StringIO):
def write(self, txt):
pass
def silent(fn):
"""Decorator to silence functions."""
def silent_fn(*args, **kwargs):
saved_stdout = sys.stdout
sys.stdout = NullIO()
result = fn(*args, **kwargs)
sys.stdout = saved_stdout
return result
return silent_fn
def nasty():
"""Uselful function with nasty prints."""
print('a lot of annyoing output')
return 42
# Wrap in decorator to prevent printing.
silent_nasty = silent(nasty)
# Same output, but prints only once.
nasty(), silent_nasty()