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)