2010-10-03 22 views
49

से पहले कुछ करने से आप कैसे एक समारोह या कुछ है कि पहले अपने कार्यक्रम इस्तीफा निष्पादित किया जाएगा हो सकता है? मेरे पास एक ऐसी स्क्रिप्ट है जो लगातार पृष्ठभूमि में चल रही है, और मुझे कुछ डेटा को बाहर निकलने से पहले फ़ाइल में सहेजने की आवश्यकता है। क्या ऐसा करने का एक मानक तरीका है? बाहर atexit मॉड्यूलकार्यक्रम बाहर निकलने के

+1

आप स्क्रिप्ट को कैसे रोकते हैं? – phimuemue

+1

स्क्रिप्ट कभी नहीं बंद कर देना चाहिए, लेकिन शायद किसी प्रक्रिया या Ctrl + \ या कुछ और मार डालेगा। – RacecaR

उत्तर

77

की जांच:

http://docs.python.org/library/atexit.html

उदाहरण के लिए, अगर मैं एक संदेश मुद्रित करने के लिए करना चाहता था जब मेरे आवेदन को समाप्त किया गया था:

import atexit 

def exit_handler(): 
    print 'My application is ending!' 

atexit.register(exit_handler) 

बस ध्यान रखें कि इस के लिए अच्छा काम करता है हो सकता है स्क्रिप्ट का सामान्य समापन, लेकिन यह सभी मामलों में नहीं बुलाया जाएगा (उदाहरण के लिए घातक आंतरिक त्रुटियां)।

+2

यदि आप Ctrl + C या Ctrl + \ दबाते हैं तो इसे कहने के लिए कोई तरीका है? – RacecaR

+5

यदि आप Ctrl + C दबाते हैं तो इसे कॉल किया जाएगा। यह बस एक कीबोर्ड इंटरप्ट अपवाद उठाता है। –

+1

ओह, मैं इसे भूल गया। और मुझे लगता है कि अगर कोई पाइथन प्रक्रिया को सही करता है तो आप कुछ नहीं कर सकते हैं? – RacecaR

6

आप (जैसे Ctrl-C दबाकर) एक KeyboardInterrupt बढ़ाकर स्क्रिप्ट रोकते हैं, तो पकड़ कर सकते हैं कि सिर्फ एक मानक अपवाद के रूप में। आप उसी तरह SystemExit भी पकड़ सकते हैं।

try: 
    ... 
except KeyboardInterrupt: 
    # clean up 
    raise 

मैं इसका उल्लेख करता हूं ताकि आप इसके बारे में जान सकें; ऐसा करने का 'सही' तरीका ऊपर वर्णित atexit मॉड्यूल है। अंत में:

16

आप कुछ हमेशा चलाने के लिए, यहां तक ​​कि त्रुटियों पर, का उपयोग कोशिश चाहते हैं इस तरह -

def main(): 
    try: 
     execute_app() 
    finally: 
     handle_cleanup() 

if __name__=='__main__': 
    main() 

आप भी अपवाद को संभालने के लिए चाहते हैं तो आप को छोड़कर एक सम्मिलित कर सकते हैं: अंत में से पहले:

+3

प्रक्रिया की हत्या के कारण SIGTERM होता है जब काम नहीं करता है। – ramu

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