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

tan*_*llo 28 python pygame sdl

我正在使用Pygame/SDL的操纵杆模块从游戏手柄获取输入.每当我调用它的get_hat()方法时,它就会打印到控制台.这是有问题的,因为我使用控制台来帮助我调试,现在它SDL_JoystickGetHat value:0:每秒被淹没60次.有没有办法可以禁用它?通过Pygame/SDL中的选项或在函数调用时抑制控制台输出?我在Pygame文档中没有提到这一点.

编辑:原来是由于在编译SDL库时打开了调试.

cha*_*ker 32

为了完整起见,这是戴夫史密斯博客的一个很好的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以在任何想要抑制输出的地方使用上下文管理:

print("Now you see it")
with suppress_stdout():
    print("Now you don't")
Run Code Online (Sandbox Code Playgroud)

  • 将所有“out”替换为“err”以抑制警告和错误消息,比较@telotortium的答案。 (3认同)

tel*_*ium 15

你可以通过将标准输出/错误(我不知道它将去哪一个)分配给空设备来解决这个问题.在Python中,标准输出/错误文件是sys.stdout/ sys.stderr,而空设备是os.devnull,所以你这样做

sys.stdout = open(os.devnull, "w")
sys.stderr = open(os.devnull, "w")
Run Code Online (Sandbox Code Playgroud)

这应该完全禁用这些错误消息.不幸的是,这也将禁用所有控制台输出.要解决此问题,请在调用get_hat()方法之前禁用输出,然后通过执行操作将其还原

sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
Run Code Online (Sandbox Code Playgroud)

它将标准输出和错误恢复到原始值.

  • 第一点有效,但是即使使用“恢复”代码,我在它之后仍然没有得到任何控制台输出?我使用的是 Ubuntu 14.04 和 3.4.3 (2认同)

Moh*_*adi 9

要完成查尔斯的答案,有建于Python的两次上下文经理,redirect_stdout并且redirect_stderr您可以使用重定向和或抑制命令输出到文件或StringIO变量.

import contextlib

with contextlib.redirect_stdout(None):
    do_thing()
Run Code Online (Sandbox Code Playgroud)

有关更完整的解释,请阅读文档

  • @myidealab由于 print 语句将返回 None,这不是与在 with 之前添加 1 相同吗? (2认同)

Vic*_*art 6

基于@charleslparker 的回答

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")
Run Code Online (Sandbox Code Playgroud)

测试

>>> with suppress_stdout():
        os.system('play /mnt/Vancouver/programming/scripts/PHASER.WAV')

/mnt/Vancouver/programming/scripts/PHASER.WAV:

 File Size: 1.84k     Bit Rate: 90.4k
  Encoding: Unsigned PCM  
  Channels: 1 @ 8-bit    
Samplerate: 11025Hz      
Replaygain: off         
  Duration: 00:00:00.16  

In:100%  00:00:00.16 [00:00:00.00] Out:1.79k [!=====|=====!]        Clip:0    
Done.
Run Code Online (Sandbox Code Playgroud)

使用它来完全抑制os.system()输出:

>>> with suppress_stdout():
        os.system('play /mnt/Vancouver/programming/scripts/PHASER.WAV >/dev/null 2>&1')
>>> ## successfully executed

>>> import time
>>> with suppress_stdout():
        for i in range(3):
                os.system('play /mnt/Vancouver/programming/scripts/PHASER.WAV >/dev/null 2>&1')
                time.sleep(0.5) 
>>> ## successfully executed

Run Code Online (Sandbox Code Playgroud)

有用(例如)用于发出长时间运行的脚本完成的信号。


fen*_*ost 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) {
Run Code Online (Sandbox Code Playgroud)

开启调试功能似乎是一个问题。

  • @jackson是SDL的编译时调试选项。出现此消息是因为编译SDL库时已定义DEBUG符号。 (4认同)