繁体   English   中英

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

[英]To prevent a function from printing in the batch console in Python

好吧,标题在我看来就足够了。 我使用一些函数在某些时候在控制台中打印一些东西。 由于我无法修改它们,我想知道是否有解决方案可以在使用这些功能时不打印。

非常感谢 !

妮可

是的,您可以重定向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 的回答是可以的,但是没有必要实际打开 null 设备。 顺便说一句,如果你想要便携式空设备,有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())

您可以使用此答案的修改版本来创建“空”输出上下文来包装函数调用。

这可以通过在使用时将os.devnull作为new_stdout参数传递给stdout_redirected()上下文管理器函数来完成。

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

传递给函数及其参数/参数 ( args ) 使其deafen 它备份旧的sys.stdout ,切换到os.devnull并返回自身。

对于一个完整的例子,我们可以创建第二个函数( test_function ):

def test_function(first_argument, second_argument, *args):
    print(first_argument)
    print(second_argument)
    print(args)

现在,如果我们test_function尝试使用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函数仍然返回函数输出。 您也可以使用deafensys.__stdout__通过替换sys.stdout = real_stdoutsys.stdout = sys.__stdout__ (可能还有去除real_stdout = sys.stdout ,而你在它)。

希望能帮助任何正在寻找更强大或更灵活的解决方案(可能用于 Jupyter 笔记本,或与多种功能一起使用)的人!

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__

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM