2012-03-16 14 views
11

मैं जानना चाहता हूं कि पाइथन लिपि सही तरीके से समाप्त हो रही है या नहीं। इसके लिए मैं atexit का उपयोग कर रहा हूं लेकिन समस्या यह है कि मुझे नहीं पता कि एटएक्सिट को sys.exit (0) या शून्य या अपवाद के साथ बुलाया गया था या नहीं।पायथन में अटैचिट कॉलबैक कहलाते समय निकास कोड या कारण कैसे प्राप्त करें?

तर्क: यदि प्रोग्राम ठीक से समाप्त होता है, तो यह कुछ भी नहीं करेगा, लेकिन यदि प्रोग्राम अपवाद से समाप्त होता है या शून्य से अलग त्रुटि कोड (निकास स्थिति) लौटाता है तो मैं कुछ क्रिया को ट्रिगर करना चाहता हूं।

यदि आपको आश्चर्य होगा कि मैं कोशिश क्यों नहीं कर रहा/आखिरकार ऐसा इसलिए है क्योंकि मैं एक सामान्य मॉड्यूल आयात करने वाली दर्जन स्क्रिप्ट के लिए एक ही व्यवहार जोड़ना चाहता हूं। उन सभी को संशोधित करने के बजाय, मैं आयात किए जा रहे मॉड्यूल में एटएक्सिट() हैक जोड़ना चाहता हूं और इन व्यवहारों को उन सभी में मुफ्त में प्राप्त करना चाहता हूं।

+0

आप क्या हासिल करना चाहते हैं? उचित त्रुटि प्रबंधन का उपयोग क्यों न करें? –

उत्तर

7

आप का समाधान प्राप्त कर सकते हैं इस sys.excepthook और द्वारा उपयोग करते हुए बंदर-पैच sys.exit():

import atexit 
import sys 

class ExitHooks(object): 
    def __init__(self): 
     self.exit_code = None 
     self.exception = None 

    def hook(self): 
     self._orig_exit = sys.exit 
     sys.exit = self.exit 
     sys.excepthook = self.exc_handler 

    def exit(self, code=0): 
     self.exit_code = code 
     self._orig_exit(code) 

    def exc_handler(self, exc_type, exc, *args): 
     self.exception = exc 

hooks = ExitHooks() 
hooks.hook() 

def foo(): 
    if hooks.exit_code is not None: 
     print("death by sys.exit(%d)" % hooks.exit_code) 
    elif hooks.exception is not None: 
     print("death by exception: %s" % hooks.exception) 
    else: 
     print("natural death") 
atexit.register(foo) 

# test 
sys.exit(1) 
+0

@ सोरीन: यह मेरे लिए ठीक काम करता है। मैंने एक वर्ग में हुक फ़ंक्शंस को लपेट लिया (जो कार्यक्षमता नहीं बदलता) और 'sys.exit (1) 'जोड़ा। यह पायथन 2.7 पर मेरे लिए sys.exit (1) 'प्रिंट करता है। –

+0

@ सोरीन: क्या आप 'patched_exit' के अंदर 'वैश्विक निकास_कोड' भूल गए थे? मैं इसे पहले भूल गया, लेकिन जवाब पोस्ट करने के बाद इसे सही तरीके से संपादित किया। –

+1

पायथन 3 पर भी काम करता है। –