es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La biblioteca subprocess de Python no captura stderr de un comando pv.

Necesito ejecutar un script de bash con python y mostrar la salida. Algunos de estos scripts contienen comandos pv, pero desde subprocess no puedo obtener la salida de pv.

import subprocess as sp

p = sp.Popen(["./script.sh"], shell=False, bufsize=1, stdout=sp.PIPE, stderr=sp.STDOUT, universal_newlines=True)

p.wait()

print(p.returncode)
print(p.stdout.read())
#!/bin/bash

set -e

echo "aaa"
echo "bbb" >&2

pv -L 1000 -F "%t %b %r %e" /path/to/some/file | cat > /tmp/foo

Al ejecutar este script de python, simplemente obtengo las salidas de echo:

$ python script.py 
0
aaa
bbb
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para mostrar la salida del comando pv, debes redirigir el stderr de subprocess a sp.PIPE en lugar de sp.STDOUT. Luego, puedes leer la salida del stderr por separado utilizando p.stderr.read(). Aquí tienes el código de Python actualizado:

    import subprocess as sp
    
    p = sp.Popen(["./script.sh"], shell=False, bufsize=1, stdout=sp.PIPE, stderr=sp.PIPE, universal_newlines=True)
    
    p.wait()
    
    print(p.returncode)
    print(p.stdout.read())
    print(p.stderr.read())
    

    Ahora, deberías ver la salida del comando pv:

    $ python script.py 
    0
    aaa
    bbb
    2.37GB 0:01:40 [23.7MB/s] [>      ]  9% ETA 0:15:52
    

    Ten en cuenta que pv muestra información de progreso en el stderr, por lo que debes leer p.stderr para obtenerla.

Comments are closed.