que - ¿Cómo obtener tanto el código de retorno como el resultado del subproceso en Python?
subprocess check_output python3 (1)
Esta pregunta ya tiene una respuesta aquí:
- subprocess.check_output código de retorno 3 respuestas
Al desarrollar la biblioteca de envoltorios de Python para el Debug Bridge de Android (ADB), estoy usando un subproceso para ejecutar comandos adb en shell. Aquí está el ejemplo simplificado:
import subprocess
...
def exec_adb_command(adb_command):
return = subprocess.call(adb_command)
Si el comando ejecutado correctamente exec_adb_command devuelve 0, que está bien.
Pero algunos comandos adb no solo devuelven "0" o "1", sino que también generan algunos resultados que también quiero capturar. dispositivos adb por ejemplo:
D:/git/adb-lib/test>adb devices
List of devices attached
07eeb4bb device
Ya he intentado subprocess.check_output () para ese propósito, y devuelve salida pero no el código de retorno ("0" o "1").
Lo ideal sería obtener una tupla donde t [0] es el código de retorno y t [1] es la salida real.
¿Me estoy perdiendo algo en el módulo de subproceso que ya permite obtener este tipo de resultados?
¡Gracias!
Popen y la comunicación le permitirán obtener la salida y el código de retorno.
from subprocess import Popen,PIPE,STDOUT
out = Popen(["adb", "devices"],stderr=STDOUT,stdout=PIPE)
t = out.communicate()[0],out.returncode
print(t)
(''List of devices attached /n/n'', 0)
check_output también puede ser adecuado, un estado de salida distinto de cero generará un CalledProcessError:
from subprocess import check_output, CalledProcessError
try:
out = check_output(["adb", "devices"])
t = 0, out
except CalledProcessError as e:
t = e.returncode, e.message
También debe redireccionar stderr para almacenar la salida de error:
from subprocess import check_output, CalledProcessError
from tempfile import TemporaryFile
def get_out(*args):
with TemporaryFile() as t:
try:
out = check_output(args, stderr=t)
return 0, out
except CalledProcessError as e:
t.seek(0)
return e.returncode, t.read()
Simplemente pasa tus comandos:
In [5]: get_out("adb","devices")
Out[5]: (0, ''List of devices attached /n/n'')
In [6]: get_out("adb","devices","foo")
Out[6]: (1, ''Usage: adb devices [-l]/n'')