2010-01-24 43 views
19

Ich benutze das Joystick-Modul von Pygame/SDL, um Eingaben von einem Gamepad zu erhalten. Jedes Mal, wenn ich seine get_hat() Methode anrufe, druckt es auf die Konsole. Das ist problematisch, da ich die Konsole verwende, um mir beim Debuggen zu helfen, und jetzt wird es 60 Mal pro Sekunde mit SDL_JoystickGetHat value:0: überflutet. Gibt es eine Möglichkeit, das zu deaktivieren? Entweder über eine Option in Pygame/SDL oder die Konsolenausgabe unterdrücken, während die Funktion aufruft? Ich habe das in der Pygame-Dokumentation nicht erwähnt.Wie unterdrückt man die Konsolenausgabe in Python?

bearbeiten: Dies liegt daran, dass das Debugging aktiviert ist, wenn die SDL-Bibliothek kompiliert wurde.

+0

Jetzt bin ich neugierig, welche Plattform Sie verwenden (Linux-Distribution?), Und welches Paket Sie verwenden? Oder hast du es selbst kompiliert? – Keith

+0

Das war vor langer Zeit, aber ich benutzte Windows, Python 2.6 und Pygame 1.9 (die SDL enthält). Ich war gerade mit ihren Windows-Installern gegangen und alles war bereits kompiliert. – tankadillo

Antwort

3

Hier ist der relevante Code-Block aus joystick.c (via SVN bei 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) { 

Sieht aus wie ein Problem mit haben, Debugging eingeschaltet.

+0

Wie würde ich das SDL-Debugging über Python deaktivieren? Google sagt mir, dass die Umgebungsvariable 'SDL_DEBUG' ist, aber das Einfügen von' os.environ ['SDL_DEBUG'] = '0'' scheint keine Auswirkungen zu haben. – tankadillo

+4

@Jackson das ist eine Debug-Option für die Kompilierung für SDL. Die Nachricht wird gedruckt, da das DEBUG-Symbol definiert wurde, wenn Ihre SDL-Bibliothek kompiliert wurde. –

+0

Ah, okay. Danke für die Hilfe! – tankadillo

10

Sie können umgehen, indem Sie den Standard out/Fehler (ich weiß nicht, welchen es wird) auf das Null-Gerät zuweisen. In Python die Standard-out/Fehler-Dateien sind sys.stdout/sys.stderr und die Null-Gerät ist os.devnull, so dass Sie

sys.stdout = os.devnull 
sys.stderr = os.devnull 

tun vollständig Dies sollte diese Fehlermeldungen deaktivieren. Leider wird dadurch auch die gesamte Konsolenausgabe deaktiviert. Um dies zu umgehen, deaktivieren Sie Ausgabe direkt vor dem get_hat() die Methode aufrufen, und dann wiederherstellen, indem

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

, die auf den ursprünglichen Wert Standard und Fehler wieder her.

+0

Ich war mir dieser Technik vorher nicht bewusst. Es scheint zu sein, was ich will, aber wenn ich es benutze, druckt die Funktion get_hat() weiterhin auf der Konsole. Könnte das ein Problem mit SDL sein? – tankadillo

+1

Durch die Verwendung von Platzhaltern für die ursprünglichen sys.stdout und sys.stderr, die beim Wiederherstellen des stdout verwendet werden sollen, wird diese Lösung in Situationen eingesetzt, in denen ein Standard-Standardoutdouent bereits vorhanden ist und nach der Unterdrückung beibehalten werden muss. zB zur Verwendung in der QGIS Python Konsole. –

+1

das erste Bit funktioniert, aber auch mit dem 'Wiederherstellen' Bit des Codes bekomme ich immer noch keine Konsolenausgabe danach? Ich bin auf Ubuntu 14.04 mit 3.4.3 – ashgetstazered

1

Ich verwende pythonw.exe (unter Windows) anstelle von python.exe. In anderen Betriebssystemen können Sie die Ausgabe auch nach/dev/nul umleiten. Und um meine Debug-Ausgabe immer noch zu sehen, verwende ich das Logging-Modul.

1

Als Demolishun Erwähnungen in einer answer zu einer geschlossenen doppelten Frage gibt es eine thread über dieses Problem zu sprechen. Der Thread ist von August 2009 und einer der Entwickler sagt the debug code was left in on accident. Ich hatte Pygame 1.9.1 von pip installiert und die Debug-Ausgabe ist noch vorhanden.

Um es jetzt zu umgehen, habe ich die Quelle von pygame.org heruntergeladen, die print-Anweisungen von src/joystick.c entfernt und den Code kompiliert.

Ich bin auf OS X 10.7.5 für was es wert ist.

17

Nur der Vollständigkeit halber, hier ist eine schöne Lösung von Dave Smith's blog:

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 

Mit diesem können Sie Kontextverwaltung verwenden, wo immer Sie unterdrücken wollen Ausgabe:

print("Now you see it") 
with suppress_stdout(): 
    print("Now you don't") 
0

Wenn Sie auf einem Debian sind oder Ubuntu-Maschine können Sie einfach Pygame ohne die Nachrichten neu kompilieren.

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 

Grüße Max

2

Charles Antwort abgeschlossen ist, gibt es zwei Kontext-Manager, um Python gebaut, redirect_stdout und redirect_stderr, die Sie einen Befehl Ausgabe zu umleiten und oder zu unterdrücken, um eine Datei oder StringIO Variable verwenden .

import contextlib 

with contextlib.redirect_stdout(None): 
    do_thing() 

Für eine vollständigere Erklärung lesen the docs

+1

Danke für den Tipp. Sie können auch eine Druckanweisung als Parameter in redirect_stdout() hinzufügen. 'mit redirect_stdout (print ('Bearbeitet!')): do_thing()' – myidealab