जवाबों:
हाँ, आप एक अवरोध हैंडलर मॉड्यूल का उपयोग कर स्थापित कर सकते हैं संकेत है, और एक का उपयोग कर हमेशा के लिए इंतजार 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
ऐसी स्थिति में एक अच्छा फिट हो सकता है, जहां आपका कोड नियंत्रण प्रवाह के शीर्ष स्तर पर नहीं है।
atexit
उदाहरण के लिए, बॉक्स से बहुत सक्षम और पठनीय है:
import atexit
def goodbye():
print "You are now leaving the Python sector."
atexit.register(goodbye)
आप इसे डेकोरेटर के रूप में भी उपयोग कर सकते हैं (2.6 के रूप में; यह उदाहरण डॉक्स से है):
import atexit
@atexit.register
def goodbye():
print "You are now leaving the Python sector."
यदि आप इसे KeyboardInterrupt
केवल विशिष्ट बनाना चाहते हैं , तो किसी अन्य व्यक्ति का इस प्रश्न का उत्तर संभवतः बेहतर है।
लेकिन ध्यान दें कि atexit
मॉड्यूल केवल ~ 70 लाइनों का कोड है और यह एक समान संस्करण बनाने के लिए कठिन नहीं होगा जो अपवादों को अलग तरह से व्यवहार करता है, उदाहरण के लिए कॉलबैक फ़ंक्शन के तर्कों के रूप में अपवादों को पारित करना। (उस की सीमा 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