我正在写一个脚本,追溯我们以前错过的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 :(得分: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