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

问题描述 投票:0回答:6

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

python printing batch-file
6个回答
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 上工作。

编辑:当有人再次包装你的函数时,使用备份变量重置标准输出会更好


9
投票

Constantinius的答案答案是可以的,但是不需要实际打开空设备。顺便说一句,如果你想要便携式零设备,有

os.devnull

实际上,您所需要的只是一个类,它将忽略您写入的任何内容。所以更便携的版本是:

class NullIO(StringIO):
    def write(self, txt):
       pass

sys.stdout = NullIO()

my_nasty_function()

sys.stdout = sys.__stdout__

.


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

2
投票

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

这可以通过在使用时将

os.devnull
作为
new_stdout
参数传递给
stdout_redirected()
上下文管理器函数来完成。


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__

1
投票

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 笔记本,或与多种功能一起使用)!

© www.soinside.com 2019 - 2024. All rights reserved.