2015-06-19 18 views
12

Podczas rozwijania biblioteki Pythona dla Androida Debug Bridge (ADB), używam podprocesu do wykonywania poleceń adb w powłoce. Oto uproszczony przykład:Jak uzyskać kod powrotu i wynik z podprocesu w Pythonie?

import subprocess 

... 

def exec_adb_command(adb_command): 
    return = subprocess.call(adb_command) 

Jeśli komenda wykonana propery exec_adb_command zwraca 0, która jest OK.

Jednak niektóre polecenia adb zwracają nie tylko "0" lub "1", ale również generują pewne wyniki, które również chcę przechwycić. urządzeń ADB na przykład:

D:\git\adb-lib\test>adb devices 
List of devices attached 
07eeb4bb  device 

Ja już próbowałem subprocess.check_output() do tego celu, i to nie wyjście, ale nie kod zwrotny ("0" lub "1") powrócić.

Idealnie chciałbym uzyskać krotkę gdzie t [0] jest kodem powrotu, t [1] jest faktycznym wynikiem.

Czy brakuje mi czegoś w module podprocesu, który już pozwala uzyskać takie wyniki?

Dzięki!

Odpowiedz

22

Popen i komunikacja pozwalają uzyskać wyjście i kod powrotu.

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 mogą być również odpowiednie, niezerowy kod zakończenia podniesie 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 

trzeba także przekierować stderr do przechowywania wyjście błędu:

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

Po prostu wprowadź swoje polecenia:

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') 
+0

Niż k dla szerokiej odpowiedzi! –

+0

@ViktorMalyi, nie prob, nie ma za co. –

Powiązane problemy