कार्यक्रम से बाहर निकलने से पहले कुछ करना


101

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


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

जवाबों:


165

atexitमॉड्यूल की जाँच करें :

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

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

import atexit

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

atexit.register(exit_handler)

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


5
क्या इसे बनाने का कोई तरीका है जहां आप Ctrl + C या Ctrl + \ दबाएंगे तो इसे कहा जाएगा?
रेसक्रा

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

1
ओह, मैं यह भूल गया। और मुझे लगता है कि आप कुछ भी नहीं कर सकते हैं अगर किसी ने अजगर प्रक्रिया को सही तरीके से मार दिया है?
रेसक्का

5
@ रास्का: वास्तव में; एक प्रक्रिया को मारने की बात यह है कि इसे रोकना है। डॉक्स से Note The exit function is not called when the program is killed by a signal, when a Python fatal internal error is detected, or when os._exit() is called:।
कट्रील

18
@RacecaR, एक ही तरीका है कि आप टर्मिनेशन कोड चला सकते हैं, भले ही कोई प्रक्रिया बुरी तरह से दुर्घटनाग्रस्त हो जाए या बेरहमी से मार दी गई हो, एक अन्य प्रक्रिया में है, जिसे "मॉनिटर" या "वॉचडॉग" के रूप में जाना जाता है, जिसका एकमात्र काम लक्ष्य प्रक्रिया पर नजर रखना है। जब उचित हो, समाप्ति कोड चलाएं। बेशक जो एक बहुत ही अलग वास्तुकला की आवश्यकता है और इसकी सीमाएं हैं; अगर आपको इस तरह की कार्यक्षमता की आवश्यकता है तो आपके लिए इस मामले पर एक अलग क्यू खोलना सबसे अच्छा है।
एलेक्स मार्टेली

32

यदि आप चाहते हैं कि कुछ हमेशा त्रुटियों पर भी चले, तो try: finally:इस तरह का उपयोग करें -

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

if __name__=='__main__':
    main()

यदि आप अपवादों को भी संभालना चाहते हैं, तो आप except:पहले एक को सम्मिलित कर सकते हैंfinally:


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

16

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.