2016-02-16 23 views
5

Sto confrontando due file nel mio programma qui sotto. Se è lo stesso, sto stampando il successo come il fallimento. Sto usando uno strumento di integrazione chiamato jenkins per inviare un messaggio di posta elettronica quando si tratta di un errore nel confronto dei file, per fare ciò: devo gestire correttamente l'errore. Qualcuno può dirmi come gestire l'errore?come gestire gli errori usando 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 

Jenkins output della console:

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

Come stai chiamando questo script da Jenkins? Si potrebbe "uscire" con un codice di uscita non standard, o magari sollevare un'eccezione. O confronta i file in un modo diverso, usando i comandi bash al posto di Python. –

+1

Si potrebbe semplicemente usare 'diff'. Se i file sono uguali, il codice di uscita è '0', se sono diversi, il codice di uscita è' 1'. Usa '$?' Per ottenere il codice di uscita. –

+0

Ho lo spazio di lavoro, ho copiato il mio codice lì. Ho programmato di eseguire il mio codice per ogni ora. Ho usato solo uscire nel mio codice qui sotto stampa 'FAILURE' ma non gestisce. – sam

risposta

-1

Usa assert. Uscirà generando un'eccezione, quindi si otterrà il traceback sull'output e l'attività di Jenkins fallirà.

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() 

non vedo il punto a prendere eccezioni se l'obiettivo è esattamente per vedere che cosa è andato storto e rendere il lavoro Jenkins sicuro.

EDIT: Se davvero si vuole stampare SUCCESSO di GUASTO esplicitamente:

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

ma voglio stampare Success o Failure. come farlo ? – sam

+0

Jenkins lo farà per te. Se l'attività fallisce, l'ultima riga dell'output della console di Jenkins è "Finito: GUASTO" e "Finito: SUCCESSO" altrimenti. – ElmoVanKielmo

+0

non sta facendo. Ho provato il tuo codice – sam

2

In realtà non è necessario scrivere il proprio codice per fare questo, perché sarà solo reimplementare l'esistente cmp(1) Unix comando, o il comando fc se si utilizza Windows.

È possibile effettuare una delle seguenti nello spazio di lavoro Jenkins:

# UNIX shell 
cmp file1 file2 || send email 

Non au fait sto con lo scripting di Windows, ma qualcosa di simile dovrebbe funzionare:

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

Se vuoi davvero che il tuo script Python faccia questo ...

Jenkins eseguirà il tuo script da all'interno di una shell (o simile interprete di comandi). Per comunicare il risultato del confronto è possibile impostare lo stato di uscita del processo utilizzando sys.exit(). La convenzione è che un comando è andato a buon fine se lo stato di uscita è 0, altrimenti non è riuscito, quindi è possibile utilizzare 0 quando i file sono uguali e 1 quando non lo sono (oppure c'è stato un errore).

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) 

Poi, nel tuo spazio di lavoro Jenkins:

python compare_files.py file1 file2 || send email 

o

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

Sto confrontando questi due file, compare_files (ref_filename, cur_filename). come adattare il tuo codice? Ho fatto se non compare_files (ref_filename, cur_filename) nel tuo codice ma non funziona. – sam

+0

@sam: il mio codice si aspetta che i 2 file vengano forniti sulla riga di comando. Questi sono passati letteralmente alla funzione 'compare_files()'. Presumo che tu stia eseguendo un comando simile a 'python compare_files.py file1 file2' nell'area di lavoro di Jenkins. Non devi adattare nulla ... prova a eseguire lo script, o meglio ancora, usa semplicemente 'cmp file1 file2'. – mhawke

+0

non funziona per me. è che lavori dalla tua parte? – sam

0

È possibile confrontare riga per riga usando all e izip_longest in modo da non avere due file intere nella memoria una volta e restituire qualsiasi errno quando viene generato un errore:

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 

Qualsiasi numero di barra 0 o 1 significa che è stato generato un errore.

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

non è altro che la lettura del contenuto del file. Ho dati binari nei file e lo sto confrontando. – sam

+0

@sam, ciò che è interno è irrilevante, questo funzionerà a prescindere e restituirà il codice di errore corretto su qualsiasi errore. –

Problemi correlati