Cómo ocultar la salida del subproceso en Python 2.7

Estoy usando eSpeak en Ubuntu y tengo un script de Python 2.7 que imprime y habla un mensaje:

import subprocess text = 'Hello World.' print text subprocess.call(['espeak', text]) 

eSpeak produce los sonidos deseados, pero llena el shell con algunos errores (ALSA lib …, sin conexión de socket), por lo que no puedo leer fácilmente lo que se imprimió antes. 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 solo visualmente y mantener el shell abierto limpio para una mayor interacción.

¿Cómo puedo hacer esto?

Redirigir la salida a DEVNULL:

 import os import subprocess FNULL = open(os.devnull, 'w') retcode = subprocess.call(['echo', 'foo'], stdout=FNULL, stderr=subprocess.STDOUT) 

De hecho, es lo mismo que ejecutar este comando de shell:

 retcode = os.system("echo 'foo' &> /dev/null") 

Aquí hay una versión más portátil (solo por diversión, no es necesario en tu caso):

 #!/usr/bin/env python # -*- coding: utf-8 -*- from subprocess import Popen, PIPE, STDOUT try: from subprocess import DEVNULL # py3k except ImportError: import os DEVNULL = open(os.devnull, 'wb') text = u"René Descartes" p = Popen(['espeak', '-b', '1'], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT) p.communicate(text.encode('utf-8')) assert p.returncode == 0 # use appropriate for your program error handling here 

Use subprocess.check_output (nuevo en python 2.7). Suprimirá la salida estándar 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 progtwig si así lo desea). Ejemplo:

 import subprocess try: subprocess.check_output(['espeak', text]) except subprocess.CalledProcessError: # Do something 

También puedes suprimir stderr con:

  subprocess.check_output(["espeak", text], stderr=subprocess.STDOUT) 

Para versiones anteriores a 2.7, use

 import os import subprocess with open(os.devnull, 'w') as FNULL: try: subprocess._check_call(['espeak', text], stdout=FNULL) except subprocess.CalledProcessError: # Do something 

Aquí, puedes suprimir stderr con

  subprocess._check_call(['espeak', text], stdout=FNULL, stderr=FNULL) 

A partir de Python3 ya no necesita abrir devnull y puede llamar a subprocess.DEVNULL .

Su código se actualizaría como tal:

 import subprocess text = 'Hello World.' print(text) subprocess.call(['espeak', text], stderr=subprocess.DEVNULL) 

Si está utilizando el módulo de subproceso en Windows (no específico para esta pregunta pero coincide con el título) con Python 2.7x y es SOLO los errores que desea eliminar (específicos para esta pregunta), puede hacer algo como esto:

output = subprocess.check_output(["arp", "-a", "-N", "127.0.0.2"], stderr=subprocess.STDOUT)

Debería poder probar usando el código anterior en su sistema, pero si 127.0.0.2 existe en su tabla de arp, puede elegir una IP que no tenga un NIC asociado.

¿Por qué no usar commands.getoutput () en su lugar?

 import commands text = "Mario Balotelli" output = 'espeak "%s"' % text print text a = commands.getoutput(output)