web-dev-qa-db-ja.com

Pythonでコンソール出力を抑制する方法は?

Pygame/SDLのジョイスティックモジュールを使用して、ゲームパッドから入力を取得しています。 get_hat()メソッドを呼び出すたびに、コンソールに出力されます。コンソールを使用してデバッグを行うと、毎秒60回SDL_JoystickGetHat value:0:でフラッディングされるため、これは問題です。これを無効にする方法はありますか? Pygame/SDLのオプションを使用するか、関数の呼び出し中にコンソール出力を抑制しますか? Pygameのドキュメントでは、これについての言及はありませんでした。

編集:これは、SDLライブラリがコンパイルされたときにデバッグがオンになっていることが原因であることがわかります。

29
tankadillo

DebianまたはUbuntuマシンを使用している場合は、メッセージなしでpygameを再コンパイルするだけです。

cd /tmp
Sudo apt-get build-dep pygame
apt-get source pygame
vim pygame-1.9.1release+dfsg/src/joystick.c
# search for the printf("SDL.. messages and put a // in front
apt-get source --compile pygame
Sudo dpkg -i python-pygame_1.9.1release+dfsg-9ubuntu1_AMD64.deb

あいさつマックス

0
Max

@charleslparkerの構築 answer

_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")
_

テスト

_>>> 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.
_

これを使用して、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

_

実行時間の長いスクリプトの完了を知らせるのに便利です(例)。

0
Victoria Stuart