如何在Python中抑制控制台输出?
我正在使用Pygame/SDL的操纵杆模块来获取游戏手柄的输入。每次我调用它的get_hat()
方法时,控制台都会打印信息。这就有点麻烦,因为我用控制台来帮助调试,现在每秒钟会被SDL_JoystickGetHat value:0:
的信息淹没,足足有60次。有没有办法可以关闭这个功能?比如通过Pygame/SDL的选项,或者在调用这个函数时屏蔽控制台输出?我在Pygame的文档里没有看到相关的说明。
补充:原来这是因为在编译SDL库时开启了调试模式。
9 个回答
45
为了补充charles的回答,Python里有两个内置的上下文管理器,分别是 redirect_stdout
和 redirect_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) {
看起来是调试功能开启后出现的问题。