Estoy usando eSpeak en Ubuntu y tengo un script Python 2.7 que imprime y dice un mensaje:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
eSpeak produce los sonidos deseados, pero satura el shell con algunos errores (ALSA lib ..., no hay conexión de socket), por lo que no puedo leer fácilmente lo que se imprimió anteriormente. El código de salida es 0.
Desafortunadamente, no hay una opción documentada para desactivar su verbosidad, por lo que estoy buscando una manera de silenciarlo visualmente y mantener limpio el shell abierto para una mayor interacción.
¿Cómo puedo hacer esto?
                    
                        python
                                python-2.7
                                subprocess
                                espeak
                                
                    
                    
                        rypel
fuente
                
                fuente

os.systemsintaxis. Aunque es solo para ilustración. Seguir con el subprocesosubprocess.DEVNULsolución perfecta .Respuestas:
Redireccionar la salida a DEVNULL:
Es efectivamente lo mismo que ejecutar este comando de shell:
fuente
os.devnullsisubprocess.DEVNULLno está disponible (<3.3), usar encheck_call()lugar decall()si no verifica su código devuelto, abrir archivos en modo binario parastdin/stdout/stderr, el uso deos.system()debe desalentarse,&>no funcionashen Ubuntu un explícito>/dev/null 2>&1podría ser utilizado.os.devnullpero accidentalmente lo escribí. Además, me quedo con el uso de los OP,callya que no están atrapando la posible excepcióncheck_callque aumentaría. Y para laos.systemredirección, fue más que una ilustración de lo que está haciendo el uso efectivo del enfoque de subproceso. No realmente como una segunda sugerencia.close_fds=Trueensubprocess.callpara cerrar elFNULLdescriptor después existe el subclose_fds=True, los descriptores de archivo se cierran despuésfork()pero antesexecvp(), es decir, se cierran en el proceso secundario justo antes de que se ejecute el ejecutable.close_fds=Trueno funcionará en Windows si alguna de las transmisiones se redirige .close_fdsno cierra archivos en el proceso padre .Aquí hay una versión más portátil (solo por diversión, no es necesario en su caso):
fuente
DEVNULLque no es totalmente general, como el proporcionado porsubprocess; ya que está abiertowbno se puede usar parastdin.'r+b'modo si lo necesita en su lugar.Uso
subprocess.check_output(nuevo en python 2.7). Suprimirá stdout y generará una excepción si el comando falla. (En realidad, devuelve el contenido de stdout, por lo que puede usarlo más adelante en su programa si lo desea). Ejemplo:También puede suprimir stderr con:
Para versiones anteriores a 2.7, use
Aquí, puede suprimir stderr con
fuente
except subprocess.CalledProcessError as ey luego usee.codeoe.outputA partir de Python3 ya no necesita abrir devnull y puede llamar a subprocess.DEVNULL .
Su código se actualizará como tal:
fuente
stderrcon elstdoutcódigo anterior (o agregar como otro argumento) para suprimir las salidas. "Resultados" está en el título de la pregunta y lo que me llevó aquí ... tal vez trivial, pero pensé que valía la pena mencionarlo.¿Por qué no usar command.getoutput () en su lugar?
fuente
texttiene comillas, o usa una codificación de caracteres diferente, o demasiado grande para una línea de comando c) es solo Unix (en Python 2)