প্রোগ্রাম প্রস্থান করার আগে কিছু করছেন


102

আপনার প্রোগ্রামটি ছাড়ার আগে কীভাবে কোনও ফাংশন বা এমন কিছু কার্যকর করতে পারেন যা কার্যকর করা হবে? আমার একটি স্ক্রিপ্ট রয়েছে যা ধারাবাহিকভাবে পটভূমিতে চলতে থাকবে এবং এটি ফাইলের বাইরে বেরিয়ে আসার আগে আমার কিছু ডেটা সংরক্ষণ করা দরকার। এটি করার কোনও মানক উপায় আছে?


4
স্ক্রিপ্টটি কখনও থামানো উচিত নয় তবে সম্ভবত কেউ প্রক্রিয়াটি মেরে ফেলবে বা Ctrl + \ বা অন্য কিছু চাপবে।
রেসকাআর

উত্তর:


167

পরীক্ষা করে দেখুন atexitমডিউল:

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

উদাহরণস্বরূপ, যদি আমার অ্যাপ্লিকেশনটি সমাপ্ত হয় যখন আমি কোনও বার্তা মুদ্রণ করতে চাইতাম:

import atexit

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

atexit.register(exit_handler)

কেবল সচেতন থাকুন যে এটি স্ক্রিপ্টটির সাধারণ সমাপ্তির জন্য দুর্দান্ত কাজ করে তবে এটি সমস্ত ক্ষেত্রে ডাকা হবে না (যেমন মারাত্মক অভ্যন্তরীণ ত্রুটি)।


6
আপনি যদি Ctrl + C বা Ctrl + press টিপেন তবে এটি কল করার কোনও উপায় আছে কি?
রেসকাআর

8
আপনি Ctrl + C চাপলে কল হবে। এটি কেবল একটি কীবোর্ড আন্তঃবিধ ব্যতিক্রম উত্থাপন করে।
নেড ব্যাচেল্ডার

4
ওহ, আমি ভুলে গেছি এবং আমি ধরে নিয়েছি যে কেউ যদি অজগর প্রক্রিয়াটি ঠিকঠাক মেরে ফেলে তবে আপনি কিছুই করতে পারবেন না?
রেসকাআর

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:আগে একটি sertোকাতে পারেনfinally:


14
প্রক্রিয়াটি হত্যার কারণে যখন SIGTERM ঘটে তখন তা কাজ করে না।
রামু

16

আপনি যদি স্ক্রিপ্টটি থামিয়ে কোনও KeyboardInterrupt(উদাহরণস্বরূপ Ctrl-C টিপে) চাপিয়ে দেন তবে আপনি এটি কেবল একটি আদর্শ ব্যতিক্রম হিসাবে ধরতে পারেন। আপনি SystemExitএকইভাবে ধরতে পারেন ।

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

আমি এটি উল্লেখ করেছি যাতে আপনি এটি সম্পর্কে জানতে পারেন; এটি করার 'ডান' atexitউপায়টি হল উপরে বর্ণিত মডিউল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.