从Python脚本调用jar并获取正确的返回码

时间:2017-09-25 09:04:42

标签: java python

我正在写一个脚本,追溯我们以前错过的ETL过程。我遇到问题的是这段代码:

feed_string = java_home + '/java -Xmx6000m -jar ' + script_dir + '/Proj/Feeds.jar -o ' + feed + '_ad_hoc_load_' + date + '.csv -s FileSender -d ' + date + ' -f ' + feed + ' -r ' + script_dir + '/Feeds --config {root}/config || { echo \'' + feed + ' process FAILED...\' ; log $AUTO_JOB_NAME "Failure" 1 "' + feed + ' failed..."; exit 1; }'
print('Executing shell command:')
print(feed_string)
print('')
feed_string = str.split(feed_string, ' ')
proc = subprocess.Popen(feed_string)
proc.wait()
print proc.returncode

当我测试这个时,我使用3个日期来存档;其中2个存在,其中一个不存在。前两个日期运行没有错误,转换数据,Python代码在我的标准输出中打印0。但是最后的日期没有附带的文件,因此,我的日志打印出一个堆栈跟踪说java.io.FileNotFoundException: /path/to/file/file_20170908.data (No such file or directory) - 正如预期的那样。

问题是Python代码然后打印出另一个0,尽管它抛出FileNotFoundExecption。这是为什么?

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的方法来解析输出

from subprocess import Popen, PIPE

feed_string = java_home + '/java -Xmx6000m -jar ' + script_dir + '/Proj/Feeds.jar -o ' + feed + '_ad_hoc_load_' + date + '.csv -s FileSender -d ' + date + ' -f ' + feed + ' -r ' + script_dir + '/Feeds --config {root}/config || { echo \'' + feed + ' process FAILED...\' ; log $AUTO_JOB_NAME "Failure" 1 "' + feed + ' failed..."; exit 1; }'
p = Popen(feed_string, stderr=PIPE, stdout=PIPE, shell=True)
output, errors = p.communicate()
print [p.returncode, errors, output]
# Check here what's inside errors or output