J'utilise le module de manette de jeu de Pygame/SDL pour obtenir les données d'un gamepad. Chaque fois que j'appelle sa méthode get_hat()
, il est imprimé sur la console. C'est problématique car j'utilise la console pour m'aider à déboguer et maintenant, il est inondé de SDL_JoystickGetHat value:0:
60 fois par seconde. Est-il possible de désactiver cela? Soit via une option dans Pygame/SDL, soit supprimer la sortie de la console pendant que la fonction appelle? Je n'ai vu aucune mention de cela dans la documentation Pygame.
edit: Cela s’avère dû à l’activation du débogage lors de la compilation de la bibliothèque SDL.
Voici le bloc de code correspondant à joystick.c (via 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) {
Cela semble être un problème d'avoir le débogage activé.
Juste pour compléter, voici une solution intéressante de le blog de 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
Avec cela, vous pouvez utiliser la gestion de contexte où vous voulez supprimer la sortie:
print("Now you see it")
with suppress_stdout():
print("Now you don't")
Vous pouvez contourner ce problème en affectant la sortie/erreur standard (je ne sais pas laquelle elle va) au périphérique null. En Python, les fichiers de sortie/d'erreur standard sont sys.stdout
/sys.stderr
, et le périphérique null est os.devnull
.
sys.stdout = os.devnull
sys.stderr = os.devnull
Cela devrait complètement désactiver ces messages d'erreur. Malheureusement, cela désactivera également toutes les sorties de la console. Pour contourner cela, désactivez la sortie juste avant d'appeler la méthode get_hat()
, puis restaurez-la en faisant
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
qui restaure la sortie standard et l'erreur à leur valeur d'origine.
Pour compléter la réponse de charles, il existe deux gestionnaires de contexte intégrés à python, redirect_stdout
et redirect_stderr
, que vous pouvez utiliser pour rediriger ou supprimer une sortie de commande dans un fichier ou une variable StringIO
.
import contextlib
with contextlib.redirect_stdout(None):
do_thing()
Pour une explication plus complète, lisez la documentation
J'utilise pythonw.exe (sous Windows) au lieu de python.exe. Dans les autres systèmes d'exploitation, vous pouvez également rediriger la sortie vers /dev/nul.And afin de toujours voir ma sortie de débogage, J'utilise le module de journalisation.
Comme Demolishun mentionne dans un réponse à une question dupliquée fermée, il y a un fil qui parle de ce problème. Le fil de discussion date d'août 2009 et l'un des développeurs dit le code de débogage a été laissé par accident . J'avais installé Pygame 1.9.1 à partir de pip et la sortie de débogage est toujours présente.
Pour contourner le problème pour le moment, j'ai téléchargé le code source de pygame.org, supprimé les instructions d'impression de src/joystick.c et compilé le code.
Je suis sur OS X 10.7.5 pour ce que ça vaut.
Si vous êtes sur une machine Debian ou Ubuntu, vous pouvez simplement recompiler pygame sans les messages.
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
Salutations Max