5

Ctrl + C दबाए जाने पर मेरा जबकि लूप बाहर नहीं निकलता है। यह प्रतीत होता है कि मेरे कीबोर्ड इंटरप्ट अपवाद को अनदेखा करता है। फिरपायथन बाहर निकलें अनंत जबकि कीबोर्ड इंटरप्ट अपवाद के साथ लूप

while True: 
    try: 
    if subprocess_cnt <= max_subprocess: 
     try: 
     notifier.process_events() 
     if notifier.check_events(): 
      notifier.read_events() 
     except KeyboardInterrupt: 
     notifier.stop() 
     break 
    else: 
     pass 
    except (KeyboardInterrupt, SystemExit): 
    print '\nkeyboardinterrupt found!' 
    print '\n...Program Stopped Manually!' 
    raise 

, मुझे यकीन है कि समस्या क्या है, लेकिन मेरी टर्मिनल कभी नहीं भी मेरी अपवाद में मेरे पास दो प्रिंट अलर्ट प्रिंट नहीं कर रहा हूँ: पाश भाग इस तरह दिखता है। क्या कोई मुझे इस समस्या को समझने में मदद कर सकता है? दूसरी प्रदर्शित होने

while True: 
    try: 
    if subprocess_cnt <= max_subprocess: 
     try: 
     notifier.process_events() 
     if notifier.check_events(): 
      notifier.read_events() 
     except KeyboardInterrupt: 
     notifier.stop() 
     print 'KeyboardInterrupt caught' 
     raise # the exception is re-raised to be caught by the outer try block 
    else: 
     pass 
    except (KeyboardInterrupt, SystemExit): 
    print '\nkeyboardinterrupt caught (again)' 
    print '\n...Program Stopped Manually!' 
    raise 

except ब्लॉक में दो प्रिंट बयान के साथ अमल करना चाहिए '(फिर से)':

+2

आपका पहला 'कीबोर्डइंटरप्ट को छोड़कर' अपवाद को पकड़ता है। यदि आप इसे फिर से नहीं उठाते हैं तो यह दूसरे को छोड़कर (कीबोर्ड इंटरप्ट, सिस्टमएक्सिट) को दिखाई नहीं देगा। – eumiro

+0

@ यूमिरो - मैंने पहले कीबोर्ड इंटरप्ट को टिप्पणी की और अपवाद की सामग्री को 'पास' के साथ बदल दिया लेकिन मुझे अभी भी एक ही समस्या का सामना करना पड़ रहा है। Ctrl + C को अनदेखा किया जा रहा है (पीएस ऑक्स प्रक्रिया को अभी भी चल रहा है) – sadmicrowave

+0

@ यूमिरो मैंने कुंजीपटल इंटरप्ट को छोड़कर 'कुंजीपटल इंटरप्ट() 'को बढ़ाकर कीबोर्ड इंटरप्ट अपवाद को फिर से बढ़ाने का भी प्रयास किया है:' हालांकि मैं मैं अभी भी एक ही समस्या का सामना कर रहा हूँ। – sadmicrowave

उत्तर

11

एक raise कथन से अपनी break बयान बदलें, नीचे की तरह।

+0

जब आपने इसके बारे में नहीं पूछा था, तो आपके कोड में 'पास' कथन एक स्पिन-लॉक कहलाता है। स्पिन-लॉक सीपीयू को बिना किसी उपभोग का उपभोग करते हैं और समग्र प्रणाली के प्रदर्शन को प्रभावित कर सकते हैं। उनसे बचने के तरीके हैं। सूत्रों के बीच संचार के लिए 'quue.Queue' ऑब्जेक्ट्स का उपयोग करके थ्रेड के बीच संचार करने के लिए 'select.select' या' multiprocessing' मॉड्यूल 'का उपयोग करके जांच करें। – wberry

+0

तो, यह मेरे लिए होता है कि मेरी मुख्य समस्या (मुझे असंबंधित माना जाता है) क्या मैंने अपनी स्क्रिप्ट को दो बार 'deemonize' करने के लिए फोर्क किया है। ऐसा होने पर, कीबोर्डइंटरप्ट अब एक ही टर्मिनल से कनेक्ट नहीं है (हालांकि, मेरी स्क्रिप्ट अभी भी सक्रिय टर्मिनल पर आउटपुट प्रिंट करेगी)। क्या डिमनीकृत प्रोग्राम के भीतर अभी भी कीबोर्ड इंटरप्ट (या मेरी स्क्रिप्ट को मैन्युअल रूप से समाप्त करने का दूसरा तरीका) का उपयोग करने का कोई तरीका है? – sadmicrowave

+0

वर्तमान में मैं 'ps aux' आउटपुट के भीतर प्रोसेसिड खोज रहा हूं और' सुडो मार [पिड] 'निष्पादित कर रहा हूं; हालांकि, यह इसे मारने से पहले मेरे कोड को खूबसूरती से साफ नहीं करता है। प्रोग्राम को मारने से पहले मुझे डेटाबेस कनेक्शन बंद करना और इनोटिफ़ी घड़ियों को हटाना होगा। – sadmicrowave

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