如何在Python中抑制控制台输出?

56 投票
9 回答
136308 浏览
提问于 2025-04-15 18:23

我正在使用Pygame/SDL的操纵杆模块来获取游戏手柄的输入。每次我调用它的get_hat()方法时,控制台都会打印信息。这就有点麻烦,因为我用控制台来帮助调试,现在每秒钟会被SDL_JoystickGetHat value:0:的信息淹没,足足有60次。有没有办法可以关闭这个功能?比如通过Pygame/SDL的选项,或者在调用这个函数时屏蔽控制台输出?我在Pygame的文档里没有看到相关的说明。

补充:原来这是因为在编译SDL库时开启了调试模式。

9 个回答

45

为了补充charles的回答,Python里有两个内置的上下文管理器,分别是 redirect_stdoutredirect_stderr。你可以用它们来把命令的输出重定向或者隐藏,输出可以保存到一个文件里或者一个 StringIO 变量中。

import contextlib

with contextlib.redirect_stdout(None):
    do_thing()

想要更详细的解释,可以查看 官方文档

快速更新:在某些情况下,传入 None 可能会引发一些引用错误(比如 keras.models.Model.fit 调用了 sys.stdout.write,这会造成问题),在这种情况下,可以传入 io.StringIO() 或者 os.devnull

70

为了完整性,这里分享一个来自Dave Smith博客的好方法:

from contextlib import contextmanager
import sys, os

@contextmanager
def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout

有了这个,你可以在任何需要隐藏输出的地方使用上下文管理:

print("Now you see it")
with suppress_stdout():
    print("Now you don't")
5

这是来自 joystick.c 的相关代码块(可以通过 SVN 查看,链接是 http://svn.seul.org/viewcvs/viewvc.cgi/trunk/src/joystick.c?view=markup&revision=2652&root=PyGame

    value = SDL_JoystickGetHat (joy, _index);
#ifdef DEBUG
    printf("SDL_JoystickGetHat value:%d:\n", value);
#endif
    if (value & SDL_HAT_UP) {

看起来是调试功能开启后出现的问题。

撰写回答