2016-02-16 3 views
5

Я сравниваю два файла в моей программе ниже. Если это то же самое, я печатаю как успех иначе как отказ. Я использую интегрированный инструмент под названием 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

Как вы называете этот сценарий у Дженкинса? Вы можете «выйти» с нестандартным кодом выхода или, возможно, создать исключение. Или сравните файлы по-другому, используя команды bash вместо Python. –

+1

Вы можете просто использовать 'diff'. Если файлы одинаковые, код выхода равен '0', если они разные, код выхода равен« 1 ». Используйте '$?' Для получения кода выхода. –

+0

У меня есть рабочее пространство, я скопировал там свой код. Я планировал запустить свой код на каждый час. Я использовал только выход из своего кода ниже print '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 команды или команды fc, если вы используете Windows.

Вы можете выполнить одно из следующих действий в вашем рабочем пространстве Дженкинс:

# UNIX shell 
cmp file1 file2 || send email 

Я не сведущим с помощью сценариев Windows, но что-то, как это должно работать:

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

Если вы действительно хотите, чтобы ваш собственный скрипт Python сделал это .....

Jenkins выполнит ваш скрипт из в оболочке (или аналогичном командном интерпретаторе). Чтобы сообщить результат сравнения, вы можете установить статус завершения процесса с помощью 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

Я сравниваю эти два файла, compare_files (ref_filename, cur_filename). как адаптироваться в вашем коде? Я сделал, если не compare_files (ref_filename, cur_filename) в вашем коде, но он не работает. – sam

+0

@sam: мой код ожидает, что в командной строке будут представлены 2 файла. Они передаются дословно для функции compare_files(). Я предполагаю, что вы используете команду, подобную 'python compare_files.py file1 file2' в рабочем пространстве Jenkins. Вам не нужно ничего адаптировать ... просто попробуйте запустить скрипт, или даже лучше, просто используйте 'cmp file1 file2'. – mhawke

+0

его не работает для меня. это работа на вашей стороне? – sam

0

Вы можете сравнить построчно с помощью all и izip_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, то, что внутри, не имеет значения, это будет работать независимо и вернет правильный код ошибки при любой ошибке. –

Смежные вопросы