微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何从Python的子过程中获取返回代码和输出?

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

解决方法

在为Android调试桥(ADB)开发python包装器库时,我正在使用 进程在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]是实际输出。

我是否在子流程模块中丢失了已经允许获得此类结果的内容?

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。