【问题标题】:Calling a jar from a Python script and getting proper return codes从 Python 脚本调用 jar 并获取正确的返回码
【发布时间】:2018-03-06 04:45:12
【问题描述】:

我正在编写一个脚本来追溯执行我们之前错过的 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。这是为什么呢?

【问题讨论】:

  • 如果您手动运行该命令,您能否捕获不同于 0 的返回码? (不使用python)
  • 如何获得返回码?执行命令只是打印出日志和堆栈跟踪。
  • 你在linux上吗?运行命令,然后运行 ​​echo $?例如,它将返回 0 或 127。例如,要对其进行测试,您可以键入“asdafg”,它将返回“command not found”,然后回显 $?将返回 127,或者如果您键入“ps”,它将显示进程列表并返回 0
  • 啊,这种情况下运行命令返回-bash-4.1$ echo $? 0
  • 是的,所以 python 只是打印它,它不会做任何魔法,如果 java 程序本身没有返回错误代码,你将不得不解析 proc 输出而不是检查错误

标签: java python


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多