2016-02-16 14 views
5

Programımdaki iki dosyayı karşılaştırıyorum. Aynı ise, başarısızlık olarak başka bir başarı olarak basıyorum. Dosyaları karşılaştırmada hata oluştuğunda e-posta göndermek için jenkins adında bir tümleştirme aracı kullanıyorum - hatayı doğru şekilde ele almalıyım. Birisi bana hatanın nasıl halledileceğini söyleyebilir mi?python kullanarak hataları nasıl ele alınır?

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 konsol çıkışı:

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

Bu betiği nasıl Jenkins'den arıyorsunuz? Standart olmayan bir çıkış koduyla çıkabilirsiniz veya belki bir istisna oluşturabilirsin. Ya da Python yerine bash komutlarını kullanarak dosyaları farklı bir şekilde karşılaştırın. –

+1

Sadece 'diff' kullanabilirsiniz. Eğer dosyalar aynı ise, çıkış kodu "0", eğer farklıysa, çıkış kodu "1" dir. Çıkış kodunu almak için '$?' Kullanın. –

+0

Çalışma alanım var, kodumu orada kopyaladım. Kodumu her bir saat için çalıştırmayı planladım. 'FAILURE' yazısının altındaki kodumda sadece çıkış yaptım, ancak işlemiyor. – sam

cevap

-1

kullanın assert. Bir istisna atmaktan vazgeçecek, böylece çıktıya çıktı yazılacak ve Jenkins görevi başarısız olacak. Amaç neyin yanlış gittiğini görmek ve Jenkins işi başarısız yapmak tam olup olmadığını

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

İstisna yakalanmasında nokta görmüyorum.

DÜZENLEME: gerçekten açıkça ARIZA BAŞARIYI yazdırmak isterseniz:

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

'u görebiliyor, ancak Başarı veya Hata yazdırmak istiyorum. bu nasıl yapılır ? – sam

+0

Jenkins bunu sizin için yapacak. Görev başarısız olursa, Jenkins konsol çıkışının son satırı 'Bitirdi: ARIZA' ve 'Bitti: BAŞARISIZ'. – ElmoVanKielmo

+0

yapmıyor. Kodunuzu denedim – sam

2

Bunu yapmak için kendi kod yazmak gerçekten gerekli değildir, sadece cmp(1) mevcut Unix reimplementing olacak çünkü komutunu veya Windows kullanıyorsanız fc komutunu kullanın.

Sen Jenkins çalışma alanında aşağıdakilerden birini yapabilirsiniz: Windows komut dosyası ile değil au fait değilim, ama böyle bir şey çalışması gerekir

# UNIX shell 
cmp file1 file2 || send email 

:

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

Bunu yapmak için kendi Python komut dosyasını gerçekten istiyorsanız .....

Jenkins komut dosyasını bir kabuk içinde (veya benzer bir komut yorumlayıcısı). Karşılaştırmanın sonucunu bildirmek için işlemin çıkış durumunu sys.exit() kullanarak ayarlayabilirsiniz. Sözleşme, çıkış durumu 0 ise bir komutun başarılı olduğunu, aksi halde başarısız olduğunu, bu nedenle dosyalar aynı olduğunda 0 ve 1 olmadığında (veya bir hata oluştuğunda) başarılı olmanızdır. senin Jenkins çalışma alanında Sonra

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 

veya

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

Bu iki dosyayı karşılaştırıyorum, compare_files (ref_filename, cur_filename). Kodunuza nasıl uyarlanırsınız? Kodunuzda compare_files (ref_filename, cur_filename) olmasaydı, ancak çalışmadı. – sam

+0

@sam: Kodum, komut satırında sağlanacak olan 2 dosyayı bekliyor. Bunlar, compare_files() işlevine aktarılmıştır. Jenkins çalışma alanınızda 'python compare_files.py file1 file2' benzeri bir komut çalıştırdığınızı varsayalım. Herhangi bir şeye adapte olmanıza gerek yok ... sadece betiği çalıştırmayı deneyin, hatta daha iyisi, 'cmp file1 file2' kullanın. – mhawke

+0

onun için çalışmıyor. senin tarafında mı çalışıyor? – sam

0

sen burda bellekte iki bütün dosyaları olmaz all ve izip_longest kullanarak satır satır karşılaştırabilirsiniz Bir hata oluştuğunda bir kere errno döndürün:

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 

Herhangi bir sayı çubuğu 0 veya 1, bir hata oluştuğunu gösterir.

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

karşılaştırması, dosyanın içeriğini okumaktan başka bir şey değildir. Dosyalarımda ikili veriler var ve bunu karşılaştırıyorum. – sam

+0

@sam, içerideki konu ilgisizdir, bu durum hatasız çalışır ve herhangi bir hatada doğru hata kodunu döndürür. –

İlgili konular