2016-03-23 2 views
0

Ich bin etwas neu bei Python, also stelle ich mir vor, dass diese Frage eine einfache Antwort hat. Aber ich kann nirgends eine Lösung finden.Wie kann ich ein Python-Skript manuell beenden, ohne die Dateiausgabe zu unterbrechen?

Ich habe ein Python-Skript, das kontinuierlich Eingaben von einer Streaming-API akzeptiert und die Daten in einer Datei speichert.

Mein Problem, wenn ich das Skript anhalten muss, um den Code zu ändern. Wenn ich ctrl-f2 verwende, erwische ich das Skript manchmal, während es gerade in die Ausgabedatei schreibt, und die Datei wird beschädigt.

Gibt es eine einfache Möglichkeit, Python manuell zu stoppen, damit die aktuelle Codezeile ausgeführt werden kann?

+1

mehr überprüfen Das klingt wie ein Problem für die [ 'signal'] (https: //docs.python. org/3.5/library/signal.html) und ['atexit] (https://docs.python.org/3.5/library/atexit.html) Module. Sie sollten jedoch eine Transaktionsdatenbank zum Speichern der Daten in Betracht ziehen. – ChrisP

+0

Ich würde zweite atexit ... –

+0

Danke. Allerdings hätte ich in der Frage angeben sollen, dass ich den "Stop" -Button von Pycharm verwende, um das Skript zu beenden. Und es scheint nicht, dass es gefangen werden kann, da es ein Sigill-Signal sendet. Gibt es eine andere Möglichkeit, ein Skript anzuhalten, das ein anderes Signal senden würde? Ich habe Ctrl-C ausprobiert und es scheint nicht mit Pycharm zu funktionieren. – mgalka

Antwort

0

Sie können das Signal oder SIGINT abfangen und eine globale Variable festlegen, die Ihr Skript routinemäßig überprüft, um zu sehen, ob es beendet werden sollte. Es kann bedeuten, dass Sie Ihre Operationen in kleinere Stücke brechen müssen, so dass Sie die Exit-Variable häufig

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

Danke. Obwohl es so aussieht, als würde der Stop-Button von Pycharm ein Sigill-Signal senden, was diese Methode nicht erfassen würde. Wissen Sie, ob es eine andere Möglichkeit gibt, ein Python-Skript zu stoppen, das ein abfangbares Signal sendet? – mgalka

+0

Wenn Sie es von einer Shell aus ausführen, sendet STRG-C ein SIGINT –

Verwandte Themen