如何在Python中从子进程获取返回代码和输出?

如何在Python中从子进程获取返回代码和输出?,python,subprocess,adb,Python,Subprocess,Adb,在为Android调试桥(ADB)开发python包装库时,我使用子流程在shell中执行ADB命令。以下是简化的示例: import subprocess ... def exec_adb_command(adb_command): return = subprocess.call(adb_command) 如果执行了命令,则propery exec\u adb\u命令返回0,这是正常的 但是一些adb命令不仅返回“0”或“1”,而且还生成一些我想要捕获的输出。adb设备,例如:

在为Android调试桥(ADB)开发python包装库时,我使用子流程在shell中执行ADB命令。以下是简化的示例:

import subprocess

...

def exec_adb_command(adb_command):
    return = subprocess.call(adb_command)
如果执行了命令,则propery exec\u adb\u命令返回0,这是正常的

但是一些adb命令不仅返回“0”或“1”,而且还生成一些我想要捕获的输出。adb设备,例如:

D:\git\adb-lib\test>adb devices
List of devices attached
07eeb4bb        device
我已经为此尝试了subprocess.check_output(),它确实返回了输出,但没有返回代码(“0”或“1”)

理想情况下,我希望得到一个元组,其中t[0]是返回代码,t[1]是实际输出

我是否在子流程模块中遗漏了一些已经允许获得此类结果的内容


谢谢

Popen和communicate将允许您获取输出和返回代码

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_输出也可能适用,非零退出状态将引发调用的进程错误:

from subprocess import check_output, CalledProcessError

try:
    out = check_output(["adb", "devices"])
    t = 0, out
except CalledProcessError as e:
    t = e.returncode, e.message
您还需要重定向stderr以存储错误输出:

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()
只需传递您的命令:

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

谢谢你宽泛的回答@ViktorMalyi,没问题,不客气。它不应该是e.message,而是e.output:,?在Python 2中:
rc,out=commands.getstatusoutput(“cmd…”)
,在Python 3中:
rc,out=subprocess.getstatusoutput(“cmd…”)