2010-01-24 17 views
19

Sto usando il modulo joystick di Pygame/SDL per ottenere input da un gamepad. Ogni volta che chiamo il suo metodo get_hat() stampa sulla console. Questo è problematico poiché utilizzo la console per aiutarmi a eseguire il debug e ora viene inondato con SDL_JoystickGetHat value:0: 60 volte al secondo. C'è un modo per disabilitare questo? O tramite un'opzione in Pygame/SDL o l'output della console di soppressione mentre la funzione chiama? Non ho visto nulla di questo nella documentazione di Pygame.Come sopprimere l'output della console in Python?

modifica: Questo risulta essere dovuto al debug che si attiva quando la libreria SDL è stata compilata.

+0

Ora sono curioso di quale piattaforma che si sta utilizzando (Linux distro?), E ciò che il pacchetto che si sta utilizzando? O lo hai compilato tu stesso? – Keith

+0

Questo era molto tempo fa, ma stavo usando Windows, Python 2.6 e Pygame 1.9 (che include SDL). Ero appena andato con i loro programmi di installazione di Windows e tutto era già compilato. – tankadillo

risposta

3

Ecco il blocco rilevante di codice da joystick.c (via SVN a 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) { 

Sembra un problema di avere il debug attivata.

+0

Come disabilitare il debug SDL con Python? Google mi dice che la variabile d'ambiente è 'SDL_DEBUG' ma l'inserimento di' os.environ ['SDL_DEBUG'] = '0'' sembra non avere alcun effetto. – tankadillo

+4

@jackson è un'opzione di debug a tempo di compilazione per SDL. Il messaggio sta stampando perché quando la libreria SDL è stata compilata, è stato definito il simbolo DEBUG. –

+0

Ah, ok. Grazie per l'aiuto! – tankadillo

10

È possibile aggirare questo assegnando lo standard di uscita/errore (non so quale sta andando) al dispositivo null. In Python, file/errore lo standard out sono sys.stdout/sys.stderr, e il dispositivo è nullo os.devnull, in modo da fare

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

Questo dovrebbe disabilitare completamente questi messaggi di errore. Sfortunatamente, questo disabiliterà anche tutti gli output della console. Per aggirare il problema, disattivare l'uscita a destra prima di chiamare il get_hat() il metodo, e poi ripristinarlo facendo

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

che ripristina standard out e l'errore al loro valore originale.

+0

Non ero a conoscenza di questa tecnica prima. Sembra essere quello che voglio, ma quando provo ad usarlo la funzione get_hat() continua a stampare sulla console. Questo potrebbe essere un problema con SDL? – tankadillo

+1

L'utilizzo di segnaposto per il sys.stdout originale e sys.stderr da utilizzare durante il ripristino dello stdout estenderà questa soluzione affinché funzioni in situazioni in cui uno stdout "non standard" è già presente e deve essere mantenuto dopo la soppressione. ad es. per l'uso nella console python QGIS. –

+1

il primo bit funziona, tuttavia anche con il bit di ripristino del codice non riesco ancora a ottenere alcun output della console dopo di esso? Sono su Ubuntu 14.04 con 3.4.3 – ashgetstazered

1

Io uso pythonw.exe (su Windows) anziché python.exe. In altri sistemi operativi, è anche possibile reindirizzare l'output su/dev/nul. E per vedere ancora il mio output di debug, sto usando il modulo di logging.

1

Come Demolishun menziona in un answer a una domanda duplicata chiusa, c'è un thread parlando di questo problema. Il thread è da agosto del 2009 e uno degli sviluppatori dice the debug code was left in on accident. Ho installato Pygame 1.9.1 da pip e l'output di debug è ancora presente.

Per aggirare il problema per ora, ho scaricato il codice sorgente da pygame.org, rimosso le istruzioni di stampa da src/joystick.c e compilato il codice.

Sono su OS X 10.7.5 per quello che vale.

17

Solo per completezza, ecco una bella soluzione da 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 

Con questo, è possibile utilizzare la gestione del contesto dove si vuole sopprimere uscita:

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

Se siete su una Debian o macchina Ubuntu puoi semplicemente ricompilare pygame senza i messaggi.

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 

Saluti Max

2

Per completare la risposta di Carlo, ci sono due gestori di contesto incorporati in pitone, redirect_stdout e redirect_stderr che può essere utilizzato per reindirizzare e o sopprimere un'uscita comandi in un file o StringIO variabile .

import contextlib 

with contextlib.redirect_stdout(None): 
    do_thing() 

Per una spiegazione più completa lettura the docs

+1

Grazie per il suggerimento. È anche possibile aggiungere una dichiarazione di stampa come parametro nel redirect_stdout(). 'con redirect_stdout (print ('Lavorato!')): do_thing()' – myidealab

Problemi correlati