46

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

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

4

8 に答える 8

58

完全を期すために、 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")
于 2014-07-31T14:31:13.070 に答える
20

これは、標準出力/エラー (どちらに出力されるかわかりません) をヌル デバイスに割り当てることで回避できます。Python では、標準の出力/エラー ファイルはsys.stdout/sys.stderrで、null デバイスはos.devnullです。

sys.stdout = open(os.devnull, "w")
sys.stderr = open(os.devnull, "w")

これにより、これらのエラー メッセージが完全に無効になります。残念ながら、これによりすべてのコンソール出力も無効になります。これを回避するには、メソッドを呼び出す直前に出力を無効にしてからget_hat()、次のようにして復元します。

sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__

これにより、標準出力とエラーが元の値に復元されます。

于 2010-01-24T03:16:54.047 に答える
6

これは、joystick.c からの関連するコード ブロックです ( http://svn.seul.org/viewcvs/viewvc.cgi/trunk/src/joystick.c?view=markup&revision=2652&root=PyGameの SVN 経由) 。

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

デバッグをオンにすると問題が発生するようです。

于 2010-01-24T03:42:43.480 に答える
2

python.exe の代わりに pythonw.exe (Windows の場合) を使用します。他の OS では、出力を /dev/nul にリダイレクトすることもできます。また、デバッグ出力を引き続き表示するために、logging モジュールを使用しています。

于 2011-02-21T09:00:31.337 に答える
1

Demolishunが非公開の重複した質問への回答で言及しているように、この問題について話しているスレッドがあります。このスレッドは 2009 年 8 月のもので、開発者の 1 人は、デバッグ コードが誤って残されたと言っています。pip から Pygame 1.9.1 をインストールしましたが、デバッグ出力がまだ存在します。

とりあえずこれを回避するために、pygame.org からソースをダウンロードし、src/joystick.c から print ステートメントを削除して、コードをコンパイルしました。

私はその価値のためにOS X 10.7.5を使用しています。

于 2012-11-25T04:54:31.393 に答える
0

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

あいさつマックス

于 2016-04-15T13:18:47.773 に答える