我有一个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()[:]
答案 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()
并捕获异常(它等同于之前的答案)。