我成功创建了一个slipt文件的脚本,并成功通过jython过程调用此脚本,
这是我的Jython proc:
import os
cmd = "<%=odiRef.getSchemaName("script_path","D")%>/split_ncl.sh <%=snpRef.getSchemaName("data_in","D")%>/<%=odiRef.getOption("REP_FILE")%> <%=snpRef.getOption("FILENAME")%>"
retcode = os.system(cmd)
if retcode > 1 :
raise "Fatal ListError (%d)" % retcode, "Erreur de split"
这是我的脚本shell split_ncl.sh:
exec > Log/errors.log
exec 2>&1
data_in=$1
fichier=$2
cd $data_in
#Purge des fichiers
rm -f Split/INIT_ENC.dat
rm -f Split/INIT_ELP.dat
grep -P "^..........ENC" fichier ><!> Split/INIT_ENC.dat
grep -P "^..........ELP" $fichier >> Split/INIT_ELP.dat
一切都很好。我添加了exec > Log/errors.log
和exec 2>&1
,用于将我脚本的所有错误重定向到errors.log
当我在UNIX环境中执行脚本时它运行良好它可以记录错误但是当我使用ODI并通过Jython程序调用此脚本时就像我所做的那样,它无法检测到我的shell的错误脚本,例如,如果我放fichier
而不是$fichier
(丢失$),它不正确并且它无法检测到错误。我该如何解决这个问题!
答案 0 :(得分:0)
您应该使用Python的子进程库而不是os。
os.system()
发送命令,并返回成功消息。假设它是异步的,它不等待进程完成。它只会触发这个过程。
subprocess.call()
发送命令,等待进程完成然后返回进程的返回代码。
因此,如果您将代码更改为:
retcode = subprocess.call(cmd)
if retcode > 1 :
raise "Fatal ListError (%d)" % retcode, "Erreur de split"
还有一件事,如果你试图捕获错误,请将条件语句更改为retcode != 0
,因为错误的进程可以返回0以外的任何内容。
更多信息:https://docs.python.org/2/library/subprocess.html#replacing-os-system