128 votes

Comment bloquer les appels à imprimer ?

Existe-t-il un moyen d'empêcher une fonction d'appeler print ?


J'utilise le pygame.joystick pour un jeu sur lequel je travaille.

J'ai créé un pygame.joystick.Joystick et, dans la boucle du jeu, appeler sa fonction membre get_button pour vérifier la saisie de l'utilisateur. La fonction fait tout ce dont j'ai besoin, mais le problème est qu'elle appelle également print ce qui ralentit considérablement le jeu.

Puis-je bloc cet appel à print ?

2voto

moooeeeep Points 10167

J'ai eu le même problème, et je n'ai pas trouvé d'autre solution que de rediriger la sortie du programme (je ne sais pas exactement si le spamming se produit sur stdout ou stderr) vers /dev/null le nirvana.

En effet, il s'agit d'un logiciel libre, mais je n'étais pas assez passionné pour me plonger dans les pygame et le processus de construction - pour arrêter d'une manière ou d'une autre le spam de débogage.

EDIT :

Les pygame.joystick module comporte des appels à printf dans toutes les fonctions qui renvoient les valeurs réelles à Python :

printf("SDL_JoystickGetButton value:%d:\n", value);

Malheureusement, vous devrez les commenter et recompiler l'ensemble. Peut-être que le fichier setup.py rendrait les choses plus faciles que je ne le pensais. Vous pouvez essayer ceci...

2voto

FakeRainBrigand Points 12463

Une approche complètement différente consisterait à rediriger à la ligne de commande. Si vous êtes sous Windows, cela signifie un script batch script. Sous Linux, bash.

/full/path/to/my/game/game.py > /dev/null
C:\Full\Path\To\My\Game.exe > nul

À moins que vous n'ayez affaire à plusieurs processus, cette devrait travail. Pour les utilisateurs de Windows, il peut s'agir des raccourcis que vous créez (menu Démarrer / Bureau).

2voto

xelf Points 39

Vous pouvez faire une simple redirection, cela semble beaucoup plus sûr que de jouer avec stdout, et ne nécessite pas de bibliothèques supplémentaires.

enable_print  = print
disable_print = lambda *x, **y: None

print = disable_print
function_that_has_print_in_it(1)  # nothing is printed

print = enable_print
function_that_has_print_in_it(2)  # printing works again!

Note : ceci ne fonctionne que pour désactiver la fonction print(), et ne désactivera pas toutes les sorties si vous faites des appels à quelque chose d'autre qui produit des sorties. Par exemple, si vous appelez une bibliothèque C qui produit sa propre sortie vers stdout, ou si vous utilisez intput().

1voto

Cat Plus Plus Points 53385

Non, il n'y en a pas, d'autant plus que la majorité de PyGame est écrite en C.

Mais si cette fonction appelle print, alors il s'agit d'un bug PyGame, et vous devriez le signaler.

1voto

David Nathan Points 2616

Le module que j'ai utilisé a imprimé stderr . Dans ce cas, la solution serait donc la suivante :

sys.stdout = open(os.devnull, 'w')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X