防止在Python的批处理控制台中打印函数

时间:2011-12-09 14:47:54

标签: python printing batch-file

嗯,标题似乎对我来说足够了。 我使用一些功能,在某些点打印控制台中的东西。 由于我无法修改它们,我想知道在使用这些功能时是否存在不打印的解决方案。

非常感谢!

尼科

6 个答案:

答案 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〜备份sys.__stout__而不是使用sys.stdout,然后稍后将其还原。

在Jupyter笔记本中,运行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_stdoutsys.stdout = sys.__stdout__一起使用(也可以在使用real_stdout = sys.stdout时将其删除)。

希望对正在寻求更健壮或灵活的解决方案的人有所帮助(可能适用于Jupyter笔记本,或具有多种功能)!

答案 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()