2016-02-16 10 views
5

मैं नीचे अपने कार्यक्रम में दो फाइलों की तुलना कर रहा हूं। यदि यह वही है तो मैं विफलता के रूप में सफलता के रूप में मुद्रण कर रहा हूं। मैं जेनकिंस नामक एक एकीकृत उपकरण का उपयोग कर रहा हूं, जब फाइलों की तुलना करने में विफलता हो तो ईमेल भेजना, ऐसा करने के लिए - मुझे त्रुटि को सही तरीके से संभालना होगा। क्या कोई मुझे बता सकता है कि त्रुटि को कैसे संभालना है?पायथन का उपयोग कर त्रुटियों को कैसे संभालें?

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

आप इस स्क्रिप्ट को जेनकींस से कैसे बुला रहे हैं? आप गैर-मानक निकास कोड के साथ 'बाहर निकलें' कर सकते हैं, या शायद अपवाद उठा सकते हैं। या पायथन के बजाए बैश कमांड का उपयोग करके फ़ाइलों को एक अलग तरीके से तुलना करें। –

+1

आप बस 'diff' का उपयोग कर सकते हैं। यदि फ़ाइलें समान हैं, तो बाहर निकलने वाला कोड '0' है, यदि वे अलग हैं, तो निकास कोड' 1' है। निकास कोड प्राप्त करने के लिए '$?' का उपयोग करें। –

+0

मेरे पास वर्कस्पेस है, मैंने वहां अपना कोड कॉपी किया है। मैं हर एक घंटे के लिए अपना कोड चलाने के लिए निर्धारित किया। मैंने प्रिंट 'असफलता' के नीचे अपने कोड में बस बाहर निकलता था लेकिन यह संभालना नहीं था। – sam

उत्तर

-1

उपयोग assert। यह एक अपवाद फेंकने से बाहर निकल जाएगा, इसलिए आपको आउटपुट में ट्रेसबैक लिखा जाएगा और जेनकींस कार्य विफल हो जाएगा।

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

मैं अपवाद को पकड़ने में बात नहीं दिख रहा है, तो लक्ष्य वास्तव में क्या गलत हुआ देख सकते हैं और जेनकींस काम असफल बनाने के लिए।

संपादित करें: तुम सच में स्पष्ट रूप से विफलता की सफलता प्रिंट करना चाहते हैं:

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

जेनकिन्स आपके लिए ऐसा करेंगे। यदि कार्य जेनकींस कंसोल आउटपुट की आखिरी पंक्ति में विफल रहता है तो 'समाप्त: विफलता' और 'समाप्त: सफलता' अन्यथा है। – ElmoVanKielmo

+0

यह नहीं कर रहा है। मैंने आपके कोड – sam

2

यह वास्तव में यह करने के लिए अपने खुद के कोड लिखने के लिए आवश्यक नहीं है, क्योंकि आप सिर्फ मौजूदा cmp(1) यूनिक्स reimplementing हो जाएगा यदि आप विंडोज का उपयोग कर रहे हैं तो कमांड, या fc कमांड।

आप अपने जेनकींस कार्यक्षेत्र में निम्न में से एक कर सकते हैं:

# UNIX shell 
cmp file1 file2 || send email 

मैं Windows पटकथा के साथ नहीं औ fait हूँ, लेकिन कुछ इस तरह काम करना चाहिए:

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

यदि आप वास्तव में ऐसा करने के लिए अपनी पाइथन लिपि चाहते हैं .....

जेनकींस आपकी स्क्रिप्ट को निष्पादित करेगा एक खोल के भीतर (या समान कमांड दुभाषिया)। तुलना के परिणाम संवाद करने के लिए आप 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

मैं इन दो फ़ाइलों की तुलना कर रहा हूं, compar_files (ref_filename, cur_filename)। अपने कोड में कैसे अनुकूलित करें? मैंने आपके कोड में तुलना_फाइल (ref_filename, cur_filename) की तुलना नहीं की है, लेकिन यह काम नहीं कर रहा है। – sam

+0

@sam: मेरा कोड कमांड लाइन पर 2 फ़ाइलों को आपूर्ति करने की अपेक्षा करता है। ये 'compar_files()' फ़ंक्शन के लिए शब्दकोष पारित किए जाते हैं। मुझे लगता है कि आप अपने जेनकींस वर्कस्पेस में 'python compar_files.py file1 file2' के समान कमांड चला रहे हैं। आपको कुछ भी अनुकूलित करने की ज़रूरत नहीं है ... बस स्क्रिप्ट चलाने का प्रयास करें, या इससे भी बेहतर, बस '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

@ सैम, अंदर क्या है अप्रासंगिक है, यह किसी भी त्रुटि पर सही त्रुटि कोड को ध्यान में रखकर काम करेगा। –

संबंधित मुद्दे