web-dev-qa-db-fra.com

Comment supprimer la sortie de la console en Python?

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.

21
tankadillo

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

3
fencepost

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")
26
charleslparker

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.

11
telotortium

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

5
MJafar Mash

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.

1
Henning

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.

1
sandwichthecat

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

0
Max