2016-02-16 6 views
5

以下のプログラムで2つのファイルを比較しています。それが同じであれば、私は失敗として成功として印刷しています。私はファイルを比較することに失敗したときに電子メールを送信するためにjenkinsという統合ツールを使用しています。これを行うには、エラーを適切に処理する必要があります。誰かがエラーを処理する方法を教えてもらえますか?pythonを使ってエラーを処理する方法は?

Error_Status=0 
def compare_files(file1, file2): 
    try: 
     with open(file1, 'rb') as f_file1, open(file2, 'rb') as f_file2: 
      if f_file1.read() == f_file2.read(): 
       print 'SUCCESS \n' 
       #print 'SUCESS:\n {}\n {}'.format(file1, file2) 
      else: 
       print 'FAILURE \n' 
       Error_Status=1 
    except IOError: 
     print "File is NOT compared" 
     Error_Status = 1 

ジェンキンスコンソール出力:

E:\Projekte\Audi\Cloud_SOP17_TTS>rem !BUILD step: Execute test: tts.py 

E:\Projekte\Audi\Cloud_SOP17_TTS>call python tts.py file1 file2 || echo failed 
INPUT ENG: I am tired 
Latency: 114msec 



[ERROR] Can't Create Reference PCM or Response JSON files! 
INPUT GED: facebook nachricht schönes wetter heute 
Latency: 67msec 
INPUT GED: erinnere mich an den termin heute abend 
Latency: 113msec 

E:\Projekte\Audi\Cloud_SOP17_TTS>echo Started at: 15:51:25.37 
Started at: 15:51:25.37 

E:\Projekte\Audi\Cloud_SOP17_TTS>exit 0 
Archiving artifacts 
Recording plot data 
Saving plot series data from: E:\Projekte\Audi\Cloud_SOP17_TTS\Backups\tts_2016_02_04.py 
Not creating point with null values: y=null label= url= 
No emails were triggered. 
Finished: SUCCESS 
+0

このスクリプトはJenkinsからどのように呼び出していますか?非標準の終了コードで 'exit'するか、あるいは例外を送出することができます。あるいは、Pythonの代わりにbashコマンドを使って、ファイルを別の方法で比較してください。 –

+1

あなたは単に 'diff'を使うことができます。ファイルが同じであれば、終了コードは「0」であり、異なる場合には終了コードは「1」である。 '$?'を使って終了コードを取得します。 –

+0

私はワークスペースを持っています。そこにコードをコピーしました。 1時間ごとにコードを実行する予定です。私は、 'FAILURE'の下のコードで終了しましたが、それは処理しません。 – sam

答えて

-1

使用assert。例外をスローして終了するので、トレースバックが出力に書き込まれ、Jenkinsタスクが失敗します。目標は間違っていたものを見ると、ジェンキンスジョブが失敗にするために、正確であれば

def compare_files(file1, file2): 
    with open(file1, 'rb') as f_file1, open(file2, 'rb') as f_file2: 
     assert f_file1.read() == f_file2.read() 

私は例外をキャッチするにはポイントが表示されていません。

EDIT:あなたは本当に、明示的に成功または失敗を印刷する場合:

def compare_files(file1, file2): 
    try: 
     with open(file1, 'rb') as f_file1, open(file2, 'rb') as f_file2: 
      assert f_file1.read() == f_file2.read() 
    except: 
     ''' 
     I know, I know. Normally we should catch specific exceptions. 
     But OP wants to print SUCCESS or FAILURE and fail the Jenkins job 
     in case of error. 
     ''' 
     print 'FAILURE' 
     raise 
    else: 
     print 'SUCCESS' 
+0

と表示されていますが、成功または失敗を表示したいと思います。どうやってするか ? – sam

+0

ジェンキンスはあなたのためにそれを行います。タスクが失敗した場合、Jenkinsのコンソール出力の最後の行は、「Finished:FAILURE」および「Finished:SUCCESS」です。 – ElmoVanKielmo

+0

していません。私はあなたのコードを試しました – sam

2

あなただけの既存のcmp(1)のUnixを再実装されますので、実際にこれを行うには、独自のコードを記述する必要はありませんコマンドを使用するか、Windowsを使用している場合はfcコマンドを使用します。

あなたはジェンキンスのワークスペースに、次のいずれか行うことができます。

# UNIX shell 
cmp file1 file2 || send email 

私は、Windowsのスクリプトとauのfaitがないんだけど、このような何かが動作するはずですが:

rem Windows batch file 
FC /B file1 file2 
IF %ERRORLEVEL% NEQ 0 SEND_EMAIL_COMMAND 

あなた自身のPythonスクリプトがこれを行うことを本当に望むならば.....

ジェンキンスはあなたのスクリプトをから実行しますシェル(または同様のコマンドインタープリタ)内で実行されます。比較結果を通知するには、sys.exit()を使用してプロセスの終了ステータスを設定します。規約は、終了ステータスが0の場合はコマンドが成功した、そうでない場合は失敗したので、ファイルが同じ場合は0を、そうでない場合は1を使用できます(またはエラーがあった場合)。あなたのジェンキンスのワークスペースに続いて

import sys 

def compare_files(file1, file2): 
    try: 
     with open(file1, 'rb') as f_file1, open(file2, 'rb') as f_file2: 
      return f_file1.read() == f_file2.read() 
    except Exception as exc: 
     print 'compare_files(): failed to compare file {} to {}: {}'.format(file1, file2, exc) 
    return False 

if __name__ == '__main__': 
    if len(sys.argv) >= 3: 
     if not compare_files(sys.argv[1], sys.argv[2]): 
      sys.exit(1) 
    else: 
     print >>sys.stderr, 'Usage: {} file1 file2'.format(sys.argv[0]) 
     sys.exit(2) 

python compare_files.py file1 file2 || send email 

または

call python compare_files.py file1 file2 
IF %ERRORLEVEL% NEQ 0 SEND_EMAIL_COMMAND 
+0

私はこれら2つのファイルcompare_files(ref_filename、cur_filename)を比較しています。あなたのコードにどのように適応するのですか?私はあなたのコードでcompare_files(ref_filename、cur_filename)ではないが、それは動作していませんでした。 – sam

+0

@sam:私のコードでは、2つのファイルがコマンドラインで提供されることを期待しています。これらは 'compare_files()'関数にそのまま渡されます。あなたのJenkinsワークスペースの 'python compare_files.py file1 file2'と似たコマンドを実行しているとします。あなたは何も適応させる必要はありません。単にスクリプトを実行してみてください。それよりもうまくいけば、 'cmp file1 file2'を使うだけです。 – mhawke

+0

私のために働いていません。それはあなたの側で働いていますか? – sam

0

あなたはとてもあなたがでメモリ内の2つのファイル全体を持っていないallizip_longestを使用して行ずつ比較することができます一度エラーが発生するとerrnoを返します。

from itertools import izip_longest 

def compare_files(file1, file2): 
    try: 
     with open(file1, 'rb') as f_file1, open(file2, 'rb') as f_file2: 
      return all(l1 == l2 for l1, l2 in izip_longest(f_file1, f_file2, fillvalue="")) 
    except EnvironmentError as e: 
     print("File is NOT compared, error message {}".format(e)) 
     return e.errno 

数字バー0または1は、エラーが発生したことを意味します。

In [4]: compare_files("same1.txt","same2.txt") 
Out[4]: True 

In [5]: compare_files("foo","bar") 
File is NOT compared,error message [Errno 13] Permission denied: 'foo' 
Out[5]: 13 
In [6]: compare_files("test1","test2") 
File is NOT compared,error message [Errno 21] Is a directory: 'foo' 
Out[6]: 21 
In [7]: compare_files("does_not_exist.txt","foo") 
File is NOT compared,error message [Errno 2] No such file or directory: 'does_not_exist.txt' 
Out[7]: 2 
In [8]: compare_files("log.txt","out.txt") 
Out[8]: False 
+0

はファイルの内容を読むだけです。ファイルにバイナリデータがあり、それを比較しています。 – sam

+0

@samの内部は無関係ですが、これは関係なく動作し、エラーで正しいエラーコードを返します。 –

関連する問題