2016-03-23 27 views
0

Python için biraz yeni, bu sorunun basit bir cevabı olduğunu düşünüyorum. Ama hiçbir yerde bir çözüm bulamıyorum.Python komut dosyasını dosya çıktısını kesintiye uğratmadan nasıl el ile sona erdirebilirim?

Bir akış API'sinden sürekli olarak girişi kabul eden ve verileri bir dosyaya kaydeden bir Python betiğim var.

Kodu değiştirmek için komut dosyasını durdurmam gerektiğinde sorunum. Eğer ctrl-f2 kullanırsam, çıktı dosyasına yazma sürecinde bazen betiği yakalarım ve dosya bozuldu.

Python'u el ile geçerli kod satırını yürütmeyi bitirmesini sağlayan el ile durdurmanın basit bir yolu var mı?

+1

Bu [ 'signal'] (https için bir problem gibi geliyor çıkış değişkeni kontrol böylece küçük parçalar halinde işlemlerinizi kırmaya gerek anlamına gelebilir. org/3.5/library/signal.html) ve ['atexit'] (https://docs.python.org/3.5/library/atexit.html) modülleri. Bu, verileri kaydetmek için bir işlem veritabanı düşünmek isteyebilirsiniz dedi. – ChrisP

+0

İkinci adım olabilirim ... –

+0

Teşekkürler. Yine de, Pycharm'ın "durdur" düğmesini kullanarak senaryoyu öldürdüğümü belirtmeliydim. Ve yakalanma yeteneğine sahip görünmüyor, çünkü bu bir işaret sinyali veriyor. Farklı bir sinyal gönderen bir komut dosyasını durdurmanın başka bir yolu var mı? Ctrl-C'yi denedim ve Pycharm ile çalışmıyor gibi görünüyor. – mgalka

cevap

0

SIGTERM veya SIGINT sinyalini yakalayabilir ve komut dosyanızın çıkması gerekip gerekmediğini görmek için komut dosyanızın düzenli olarak denetlediği bir genel değişken ayarlayabilirsiniz. //docs.python: Bu size daha sık

import signal 

EXIT = False 

def handler(signum, frame): 
    global EXIT 
    EXIT = True 

signal.signal(signal.SIGINT, handler) 


def long_running_operation(): 
    for i in range(1000000): 
     if EXIT: 
      # do cleanup or raise exception so that cleanup 
      # can be done higher up. 
      return 
     # Normal operation. 
+0

Teşekkürler. Pycharm'ın Stop butonu, bu metodun yakalayamayacağı bir sigkill sinyali gönderir gibi görünüyor. Takılabilir bir sinyal gönderecek bir Python betiğini durdurmanın başka bir yolu var mı? – mgalka

+0

Bir kabuktan çalıştırıyorsanız, CTRL-C bir SIGINT gönderir –