5

Ctrl + C'ye basıldığında while döngüsüm çıkmıyor. Görünüşe göre benim KeyboardInterrupt istisnamı görmezden geliyor. ilmik bölümü şöyle görünür:python çıkışı sonsuzdur

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 

Yine, sorun ama benim terminali asla bile benim istisna ben sahip iki baskı uyarıları yazdırır emin değilim. Birisi bu problemi çözmeme yardım edebilir mi?

+2

İlk ''KeyboardInterrupt' dışındaki istisnası yakalar. Yeniden yükseltmezseniz, ikinci ('KeyboardInterrupt, SystemExit)' haricinde görünmez. – eumiro

+0

@eumiro - İlk KeyboardInterrupt'ı yorumladım ve istisnanın içeriğini 'pass' ile değiştirdim ancak hala aynı sorunu yaşıyorum. Ctrl + C göz ardı ediliyor (ps aux işlemi hala devam ediyor) – sadmicrowave

+0

@eumiro Ayrıca KeyboardInterrupt istisnasını yeniden yükseltmeyi denedim. hala aynı sorunu yaşıyor. – sadmicrowave

cevap

11

aşağıda gibi bir raise deyimi ile break deyimi yerine: except bloklarda

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 

iki baskı ifadeleri ile çalıştırmak gerekir '(tekrar)' ikinci görünen.

+0

Bunu sormazken, kodunuzdaki "pass" ifadesi spin-lock olarak adlandırılan şeyi oluşturur. Spin-kilitler CPU'yu gereksiz yere tüketir ve genel sistemin performansını etkileyebilir. Onları önlemek için yollar vardır. Iş parçacıkları arasında iletişim kurmak için 'Queue.Queue 'nesnelerini ve süreçler arasında iletişim kurmak için' select.select' veya 'multiprocessing' modülünü kullanarak araştırın. – wberry

+0

Öyleyse, benim ana problemim (ilgisiz olduğunu düşündüm) benim için iki kere '' onu '' canlandırmaya '' yazdım. Bu durumda, KeyboardInterrupt artık aynı terminale bağlı değil (ancak, komutum hala çıkışları aktif terminale yazdıracaktır). Bir DAVET EDİLMİŞ program içinde hala KeyboardInterrupt (veya komut dosyasını el ile sonlandırmak için başka bir yol) kullanmak için bir yolu var mı? – sadmicrowave

+0

şu anda 'ps aux' çıktısı içindeki prosesi araştırıyorum ve bir sudo kill [pid] 'i yürütüyorum; Bununla birlikte, bu, kodumu öldürmeden önce zarif bir şekilde temizlemez. Veritabanı bağlantılarını kapatmam ve programı öldürmeden önce inotify saatlerini kaldırmam gerekiyor. – sadmicrowave