【问题标题】:How to get both return code and output from subprocess in Python? [duplicate]如何从 Python 中的子进程获取返回码和输出? [复制]
【发布时间】:2023-03-23 09:41:01
【问题描述】:

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

import subprocess

...

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

如果命令正确执行 exec_adb_command 返回 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] 是实际输出。

我是否在子流程模块中遗漏了一些已经允许获得这种结果的东西?

谢谢!

【问题讨论】:

    标签: python subprocess adb


    【解决方案1】:

    Popen and communication 将允许您获取输出和返回码。

    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 也可能是合适的,非零退出状态将引发 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
    

    你还需要重定向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:python2 doc,python3 doc?
    • 在 Python 2 中:rc, out = commands.getstatusoutput("cmd..."),在 Python 3 中:rc, out = subprocess.getstatusoutput("cmd...")
    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 2019-04-26
    • 2010-12-23
    • 2011-01-14
    • 1970-01-01
    • 2020-03-03
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多