1

ファイルをスリップするスクリプトの作成に成功し、このスクリプトを 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"

そして、これは私のスクリプト シェル 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.logexec 2>&1、スクリプトのすべてのエラーをerrors.logにリダイレクトします

UNIX環境でスクリプトを実行すると、エラーが記録される可能性がありますが、ODIを使用してJythonプロシージャでこのスクリプトを呼び出すと、シェルスクリプトのエラーを検出できませんfichier$fichier($がありません)、正しくありません。また、エラーを検出できませんでした。どうすれば問題を解決できますか。

4

1 に答える 1

0

os の代わりに Python のサブプロセス ライブラリを使用する必要があります。

os.system()コマンドを送信し、成功メッセージを返します。非同期であるとしましょう。プロセスが完了するのを待ちません。プロセスをトリガーするだけです。

subprocess.call()コマンドを送信し、プロセスが完了するのを待ってから、プロセスのリターン コードを返します。

したがって、コードを次のように変更すると:

retcode = subprocess.call(cmd) 
if retcode > 1 :     
raise "Fatal ListError (%d)" % retcode, "Erreur de split"

また、もう 1 つ、エラーをキャッチしようとする場合は、条件ステートメントを に変更してください。エラーのあるretcode != 0プロセスは 0 以外の値を返す可能性があるためです。

詳細: https://docs.python.org/2/library/subprocess.html#replaceing-os-system

于 2016-01-21T09:54:14.333 に答える