如何从 Python 中的子进程获取 return 代码和输出?
How to get both return code and output from subprocess in Python?
在为 Android 调试桥 (ADB) 开发 python 包装库时,我使用 subprocess 在 [=44= 中执行 adb 命令].这是简化的例子:
import subprocess
...
def exec_adb_command(adb_command):
return = subprocess.call(adb_command)
如果命令执行 属性 exec_adb_command returns 0 就可以了。
但是一些 adb 命令 return 不仅会生成“0”或“1”,还会生成一些我也想捕获的输出。 adb devices 例如:
D:\git\adb-lib\test>adb devices
List of devices attached
07eeb4bb device
我已经为此目的尝试了 subprocess.check_output(),它会输出 return 但不会输出 return 代码( “0”或“1”)。
理想情况下,我希望得到一个元组,其中 t[0] 是 return 代码,t[1] 是实际输出。
我是否遗漏了子流程模块中已经允许获得此类结果的内容?
谢谢!
打开并通信将允许您获得输出和 return 代码。
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 包装库时,我使用 subprocess 在 [=44= 中执行 adb 命令].这是简化的例子:
import subprocess
...
def exec_adb_command(adb_command):
return = subprocess.call(adb_command)
如果命令执行 属性 exec_adb_command returns 0 就可以了。
但是一些 adb 命令 return 不仅会生成“0”或“1”,还会生成一些我也想捕获的输出。 adb devices 例如:
D:\git\adb-lib\test>adb devices
List of devices attached
07eeb4bb device
我已经为此目的尝试了 subprocess.check_output(),它会输出 return 但不会输出 return 代码( “0”或“1”)。
理想情况下,我希望得到一个元组,其中 t[0] 是 return 代码,t[1] 是实际输出。
我是否遗漏了子流程模块中已经允许获得此类结果的内容?
谢谢!
打开并通信将允许您获得输出和 return 代码。
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')