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.system
sintaxis. Aunque es solo para ilustración. Seguir con el subprocesosubprocess.DEVNUL
solución perfecta .Respuestas:
Redireccionar la salida a DEVNULL:
Es efectivamente lo mismo que ejecutar este comando de shell:
fuente
os.devnull
sisubprocess.DEVNULL
no 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 funcionash
en Ubuntu un explícito>/dev/null 2>&1
podría ser utilizado.os.devnull
pero accidentalmente lo escribí. Además, me quedo con el uso de los OP,call
ya que no están atrapando la posible excepcióncheck_call
que aumentaría. Y para laos.system
redirecció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=True
ensubprocess.call
para cerrar elFNULL
descriptor 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=True
no funcionará en Windows si alguna de las transmisiones se redirige .close_fds
no 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
DEVNULL
que no es totalmente general, como el proporcionado porsubprocess
; ya que está abiertowb
no 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 e
y luego usee.code
oe.output
A partir de Python3 ya no necesita abrir devnull y puede llamar a subprocess.DEVNULL .
Su código se actualizará como tal:
fuente
stderr
con elstdout
có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
text
tiene 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)