2010-01-24 12 views
19

Estoy usando el módulo de joystick de Pygame/SDL para obtener información de un gamepad. Cada vez que llamo al método get_hat(), se imprime en la consola. Esto es problemático ya que uso la consola para ayudarme a depurar y ahora se inunda con SDL_JoystickGetHat value:0: 60 veces por segundo. ¿Hay alguna manera de poder desactivar esto? ¿O a través de una opción en Pygame/SDL o suprime la salida de la consola mientras la función llama? No vi mención de esto en la documentación de Pygame.¿Cómo suprimir la salida de la consola en Python?

edición: Esto resulta ser debido a la depuración de encenderla cuando se compiló la biblioteca SDL.

+0

Ahora estoy curioso lo que la plataforma que está utilizando (distribución de Linux?), Y lo que el paquete que está utilizando? ¿O compilaste tú mismo? – Keith

+0

Esto fue hace mucho tiempo, pero estaba usando Windows, Python 2.6 y Pygame 1.9 (que incluye SDL). Acababa de ir con sus instaladores de Windows y todo estaba ya compilado. – tankadillo

Respuesta

3

Aquí está el bloque correspondiente del código de joystick.c (a través de SVN en 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) { 

Parece haber un problema con la depuración activada.

+0

¿Cómo puedo deshabilitar la depuración de SDL a través de Python? Google me dice que la variable de entorno es 'SDL_DEBUG', pero insertar' os.environ ['SDL_DEBUG'] = '0'' parece no tener ningún efecto. – tankadillo

+4

@jackson es una opción de depuración de tiempo de compilación para SDL. El mensaje se está imprimiendo porque cuando se compiló su biblioteca SDL, se definió el símbolo DEBUG. –

+0

Ah, está bien. ¡Gracias por la ayuda! – tankadillo

10

Puede solucionar esto asignando el error estándar (no sé cuál será) al dispositivo nulo. En Python, archivos/error estándar del cabo son sys.stdout/sys.stderr, y el dispositivo es nula os.devnull, por lo que

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

Esto se debe desactivar estos mensajes de error completo. Desafortunadamente, esto también desactivará todos los resultados de la consola. Para evitar esto, apague la salida justo antes de llamar a la get_hat() el método, y luego restaurarlo haciendo

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

que restaura la salida estándar y el error a su valor original.

+0

No conocía esta técnica antes. Parece ser lo que quiero, pero cuando intento usarlo, la función get_hat() continúa imprimiendo en la consola. ¿Podría ser esto un problema con SDL? – tankadillo

+1

El uso de marcadores de posición para los sys.stdout y sys.stderr originales que se utilizarán al restaurar el stdout extenderá esta solución para que funcione en situaciones en las que ya exista un stdout "no estándar" y deba conservarse después de la supresión. por ejemplo, para usar en la consola QGIS python. –

+1

el primer bit funciona, sin embargo, incluso con el código 'restaurador' de código, ¿todavía no obtengo ninguna salida de consola después? Estoy en Ubuntu 14.04 con 3.4.3 – ashgetstazered

1

Uso pythonw.exe (en Windows) en lugar de python.exe. En otros sistemas operativos, también puede redireccionar la salida a/dev/nul. Y para seguir viendo mi salida de depuración, estoy usando el módulo de registro.

1

Como Demolishun menciona en un answer a una pregunta duplicada cerrada, hay un thread hablando de este problema. El hilo es de agosto de 2009 y uno de los desarrolladores dice the debug code was left in on accident. Instalé Pygame 1.9.1 desde pip y la salida de depuración aún está presente.

Para eludirlo por el momento, descargué la fuente de pygame.org, eliminé las declaraciones de impresión de src/joystick.c y compilé el código.

Estoy en OS X 10.7.5 por lo que vale la pena.

17

simplemente para la corrección, aquí es una buena solución de 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 esto, puede utilizar la administración contexto donde desee suprimir la salida:

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

Si usted está en un Debian o máquina Ubuntu, simplemente puede recompilar pygame sin los mensajes.

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 

Saludos Max

2

Para completar la respuesta de Carlos, hay dos gestores de contexto integrados en pitón, redirect_stdout y redirect_stderr que se puede utilizar para redirigir y o suprimir una salida de comandos a un archivo o StringIO variables .

import contextlib 

with contextlib.redirect_stdout(None): 
    do_thing() 

Para una explicación más completa leer the docs

+1

Gracias por el consejo. También puede agregar una declaración de impresión como parámetro en redirect_stdout(). 'con redirect_stdout (print ('¡Trabajado!')): do_thing()' – myidealab

Cuestiones relacionadas