2012-01-26 10 views
6

मैं इस तरह अजगर कुछ में कुछ कोड लिख रहा हूँ:पायथन में, क्या मैं किसी फ़ंक्शन को कीबोर्ड इंटरप्ट और सिस्टम एक्सीट को पकड़ने से रोक सकता हूं?

import sys 
try: 
    for x in large_list: 
     function_that_catches_KeyboardInterrupt(x) 
except KeyboardInterrupt: 
    print "Canceled!" 
    sys.exit(1) 

जब मैं पाश में दखल देने की कोशिश, मैं मूल रूप से नीचे नियंत्रण + सी काफी देर तक समारोह के हर मंगलाचरण रद्द करने के लिए पकड़ करने के लिए की जरूरत है large-list के सभी तत्वों के लिए, और केवल तब ही मेरा प्रोग्राम बाहर निकलता है।

क्या कोई तरीका है कि मैं फ़ंक्शन को कीबोर्ड इंटरप्ट को पकड़ने से रोक सकता हूं ताकि मैं इसे स्वयं पकड़ सकूं? एकमात्र तरीका जिसे मैं सोच सकता हूं, फ़ंक्शन को कॉल करने के लिए केवल एक अलग थ्रेड बनाकर थ्रेडिंग का दुरुपयोग करना होगा, लेकिन यह अत्यधिक लगता है।

संपादित करें: मैं अपमानजनक कोड (जो मैं आसानी से नहीं बदल सकते हैं) की जाँच की, और यह वास्तव में एक नंगे except: का उपयोग करता है, तो भी sys.exit(1) एक SystemExit अपवाद के रूप में पकड़ा है। मैं except: ब्लॉक से बच सकता हूं और अपना प्रोग्राम छोड़ सकता हूं?

+0

ऐसा लगता है कि मेरे लिए अत्यधिक नहीं है ... क्योंकि हर दूसरे समाधान के साथ मैं आ सकता हूं जिसमें कुछ प्रकार का काला शामिल होगा जादू ... – GaretJax

+0

ध्यान दें कि आपको प्रत्येक आमंत्रण के लिए धागे का उपयोग करने की आवश्यकता नहीं है, केवल एक ही पर्याप्त है। ;-) – GaretJax

उत्तर

6

आप signal लाइब्रेरी का उपयोग कर SIGINT हैंडलर को दोबारा जोड़ सकते हैं।

import signal, sys 
def handler(signal, frame): 
    print "Canceled!" 
    sys.exit(1) 
signal.signal(signal.SIGINT, handler) 
for x in large_list: 
    function_that_catches_KeyboardInterrupt(x) 

SystemExit पकड़े जाने पर कुछ तरीके बाहर निकल सकते हैं। os._exit(1) बिना सफाई के सी-स्टाइल निकास करेगा। os.kill(os.getpid(), signal.SIGTERM) दुभाषिया को क्लीनअप के कुछ स्तर की अनुमति देगा, मुझे लगता है कि फ्लैशिंग/क्लोजिंग फाइल हैंडल इत्यादि।

+0

मुझे लगता है कि वह बाहरी अपवाद हैंडलर द्वारा सिग्नल को पकड़ा जाना चाहता है, हालांकि - फ़ंक्शन के अंदर कोड द्वारा नहीं। यह इसे पूरी तरह से –

+0

दबाएगा, फिर वह sys.exit कॉल को उस चीज़ के साथ प्रतिस्थापित कर सकता है जो उसके प्रोग्राम पर वापस नियंत्रण रखता है। आप पहले से ही फ्लो कंट्रोल अपहरण से निपट रहे हैं, मुझे नहीं लगता कि आपको एक और अधिक सुरुचिपूर्ण समाधान मिल रहा है;) – stefan

+0

क्या मैं 'sys.exit' को' कीबोर्डइंटरप्ट() 'बढ़ाकर बदल सकता हूं? या मुझे एक अलग अपवाद का उपयोग करने की आवश्यकता होगी? –

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

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