检查subprocess.getoutput命令是否成功执行

时间:2018-02-10 09:08:57

标签: python

我有一个java程序,我必须从python运行,获取输出并将结果存储在3个变量中(如果它按预期工作,应该打印3个值,每个值在不同的行上)。

这是我正在使用的代码:

stdout1 = subprocess.getoutput("java -jar test.jar" + " -r " + path1)
x, y, z = stdout1.splitlines()[:]

如果test.jar程序找不到path1,它将输出一条消息来检查路径。

有没有办法检查程序是否正确执行,然后才存储输出?

x, y, z = stdout1.splitlines()[:]

2 个答案:

答案 0 :(得分:3)

你应该使用

import subprocess

try:
    stdout1 = subprocess.check_output("java -jar test.jar" + " -r " + path1, shell=True)
except subprocess.CalledProcessError as e:
    # handle error

https://docs.python.org/2/library/subprocess.html#subprocess.check_output

答案 1 :(得分:2)

您可以明确检查子流程的返回代码:

from subprocess import run, PIPE

process = run('java -Dfile.encoding=utf-8 -jar test.jar'.split()
              + ['-r', path], stdout=PIPE, encoding='utf-8')
if process.returncode == 0:  # success
    x, y, z = process.stdout.splitlines()

注意:此代码在不启动新shell的情况下运行java可执行文件。

代码使用显式utf-8编码,以避免依赖于可能不支持所有必需字符的默认语言环境编码。

在您的情况下,最小的代码更改是将getoutput()替换为getstatusoutput(),返回(exitcode, output)元组并检查exitcode是否为零以确定成功。

getstatusoutput()即使没有必要也会启动一个新shell,因此不建议这样做。此外,如果启动shell,则传递path未转义将打开shell命令注入漏洞。

getstatusoutput()在内部调用check_output()并捕获异常(它等同于之前的答案)。