উত্তর:
হ্যাঁ, আপনি একটি ইন্টারাপ্ট হ্যান্ডলার মডিউল ব্যবহার করে ইনস্টল করতে পারেন সংকেত , এবং একটি ব্যবহার চিরকাল অপেক্ষা threading.Event :
import signal
import sys
import time
import threading
def signal_handler(signal, frame):
print('You pressed Ctrl+C!')
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print('Press Ctrl+C')
forever = threading.Event()
forever.wait()
while True: continue
, যদিও। (এই স্টাইলে, while True: pass
যাই হোক না কেন পরিষ্কার হবে)) এটি খুব অপচয় হবে; এর মতো কিছু চেষ্টা করুন while True: time.sleep(60 * 60 * 24)
(একসাথে একদিনের জন্য ঘুমানো একটি সম্পূর্ণ স্বেচ্ছাচারী চিত্র)।
time
(তবে যেমনটি আপনার উচিত ছিল) তবে ভুলে যাবেন না import time
:)
যদি আপনি যা চান তা হ'ল ট্রেসব্যাক না দেখানো, আপনার কোডটি এইভাবে তৈরি করুন:
## all your app logic here
def main():
## whatever your app does.
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
# do nothing here
pass
(হ্যাঁ, আমি জানি যে এটি সরাসরি প্রশ্নের উত্তর দেয় না, তবে ব্লক ব্যতীত কেন চেষ্টা করা দরকার তা আপত্তিজনক - সম্ভবত এটি ওপিকে কম বিরক্তিকর করে তোলে)
signal.signal( signal.SIGINT, lambda s, f : sys.exit(0))
সর্বদা না।
আপনার নিজস্ব সিগন্যাল হ্যান্ডলারটি সেট করার বিকল্প হ'ল ব্যতিক্রমটি ধরতে এবং এটিকে উপেক্ষা করার জন্য একটি প্রসঙ্গ-পরিচালক ব্যবহার করা:
>>> class CleanExit(object):
... def __enter__(self):
... return self
... def __exit__(self, exc_type, exc_value, exc_tb):
... if exc_type is KeyboardInterrupt:
... return True
... return exc_type is None
...
>>> with CleanExit():
... input() #just to test it
...
>>>
এটি কী চলছে তার কিছু স্পষ্ট উল্লেখ সংরক্ষণ করে try
- except
ব্লকটিকে সরিয়ে দেয় ।
এটি আপনাকে প্রতি সময় সিগন্যাল হ্যান্ডলারগুলি সেট এবং পুনরায় সেট না করে শুধুমাত্র আপনার কোডের কিছু অংশে বাধা উপেক্ষা করতে দেয়।
আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি এখানে প্রথমে এসে atexit
মডিউলটি আবিষ্কার করেছি । আমি এর ক্রস-প্ল্যাটফর্ম ট্র্যাক রেকর্ড বা ক্যাভ্যাটগুলির সম্পূর্ণ তালিকা সম্পর্কে এখনও জানি না, তবে এখনও অবধি KeyboardInterrupt
লিনাক্স -এ পোস্ট- ক্লিনআপ হ্যান্ডেল করার চেষ্টা করেছিলাম ঠিক এটিই । সমস্যাটির কাছে যাওয়ার আরও একটি উপায় ছুঁড়ে ফেলতে চেয়েছিলেন।
আমি তারেক ক্রিয়াকলাপের প্রসঙ্গে পোস্ট-প্রস্থান এক্স-ক্লিন-আপ করতে চাই, তাই try
/ এ সমস্ত কিছু মোড়ানো except
আমার পক্ষেও বিকল্প ছিল না। atexit
আপনার কোডটি নিয়ন্ত্রণের প্রবাহের শীর্ষ স্তরে নয় এমন পরিস্থিতিতে আমার মনে হতে পারে such
atexit
বাক্সের বাইরে খুব সক্ষম এবং পাঠযোগ্য, উদাহরণস্বরূপ:
import atexit
def goodbye():
print "You are now leaving the Python sector."
atexit.register(goodbye)
আপনি এটি একটি ডেকোরেটর হিসাবেও ব্যবহার করতে পারেন (২.6 হিসাবে; ডক্স থেকে এই উদাহরণটি):
import atexit
@atexit.register
def goodbye():
print "You are now leaving the Python sector."
আপনি যদি এটি KeyboardInterrupt
কেবলমাত্র নির্দিষ্ট করতে চান তবে এই প্রশ্নের উত্তর অন্য কোনও ব্যক্তির উত্তর সম্ভবত আরও ভাল।
তবে নোট করুন যে atexit
মডিউলটি কেবল কোডের 70 ডলার লাইন এবং ব্যতিক্রমগুলি আলাদাভাবে বিবেচনা করে এমন একটি অনুরূপ সংস্করণ তৈরি করা কঠিন হবে না, উদাহরণস্বরূপ কলব্যাক ফাংশনে আর্গুমেন্ট হিসাবে ব্যতিক্রমগুলি পাস করা passing (এর সীমাবদ্ধতা atexit
একটি পরিবর্তিত সংস্করণকে ওয়ারেন্ট করবে: বর্তমানে আমি ব্যতিক্রম সম্পর্কে জানতে এক্সিট-কলব্যাক-ফাংশনগুলির জন্য কোনও উপায় কল্পনা করতে পারি না; atexit
হ্যান্ডলার ব্যতিক্রমটি ধরবে , আপনার কলব্যাক (গুলি) কল করে আবার পুনরায় উত্থাপন করবে) ব্যতিক্রম। তবে আপনি এটি অন্যভাবে করতে পারতেন))
আরও তথ্যের জন্য দেখুন:
atexit
আপনি (সর্বাধিক সুস্পষ্ট এবং প্রস্তাবিত "সেরা" সমাধান KeyboardInterrupt
ছাড়াই try: ... except KeyboardInterrupt: pass
) স্ট্যাক ট্রেস প্রিন্টিং প্রতিরোধ করতে পারেন তবে প্রতিস্থাপন করে আপনি এটি ইতিমধ্যে জানেন এবং অন্য কিছু চেয়েছিলেন) sys.excepthook
। কিছুটা এইরকম
def custom_excepthook(type, value, traceback):
if type is KeyboardInterrupt:
return # do nothing
else:
sys.__excepthook__(type, value, traceback)
আমি প্রত্যেকের দ্বারা প্রস্তাবিত সমাধানগুলি চেষ্টা করেছিলাম, তবে আসলে এটি কার্যকর করার জন্য আমাকে নিজের কোডটি তৈরি করতে হয়েছিল। নিম্নলিখিতটি আমার অস্থায়ী কোড:
import signal
import sys
import time
def signal_handler(signal, frame):
print('You pressed Ctrl+C!')
print(signal) # Value is 2 for CTRL + C
print(frame) # Where your execution of program is at moment - the Line Number
sys.exit(0)
#Assign Handler Function
signal.signal(signal.SIGINT, signal_handler)
# Simple Time Loop of 5 Seconds
secondsCount = 5
print('Press Ctrl+C in next '+str(secondsCount))
timeLoopRun = True
while timeLoopRun:
time.sleep(1)
if secondsCount < 1:
timeLoopRun = False
print('Closing in '+ str(secondsCount)+ ' seconds')
secondsCount = secondsCount - 1