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

37 投票
6 回答
30814 浏览
提问于 2025-04-17 08:03

嗯,标题看起来已经说得很清楚了。
我在用一些函数,这些函数在某些时候会在控制台上打印一些东西。
因为我不能修改这些函数,所以我想知道有没有办法在使用这些函数的时候不让它们打印内容。

6 个回答

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

Constantinius的回答是可以的,不过其实并不需要真的打开一个空设备。顺便提一下,如果你想要一个可以在不同环境下都能用的空设备,可以使用os.devnull

实际上,你只需要一个可以忽略你写入内容的类。所以更通用的版本可以是:

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

sys.stdout = NullIO()

my_nasty_function()

sys.stdout = sys.__stdout__

.

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上也可以正常工作了。

更新:使用备份变量来重置stdout会更好,这样当有人再次调用你的函数时就不会出问题。

撰写回答