python python-2.7 subprocess espeak

Cómo ocultar la salida del subproceso en Python 2.7



python-2.7 subprocess (6)

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

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

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 existe 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?


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

Su código sería actualizado como tal:

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


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


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")


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 SÓLO es el error que desea eliminar (específico 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.


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 programa si 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)