2015-10-27 5 views
5

Mein Python-Programm braucht viel Zeit, um alle Iterationen einer for-Schleife zu vervollständigen. In dem Moment, in dem ich eine bestimmte Taste/Tastenkombination auf der Tastatur wähle, während sie läuft, möchte ich, dass sie in eine andere Methode geht und die Variablen auf der Festplatte speichert (mit Pickles, die ich kenne) und das Programm sicher verlasse.Wie macht man ein Python-Programm in eine Funktion und beendet es mit Strg + X während der Ausführung?

Irgendeine Idee, wie ich das tun kann?

Ist der KeyboardInterrupt ein sicherer Weg, um nur die for-Schleife innerhalb der KeyboardInterrupt-Ausnahme wickeln, fangen und speichern Sie dann die Variablen im Block außer?

+5

Die Vorgehensweise, die Sie in Ihrem dritten Absatz beschreiben, sollte gut funktionieren. Lassen Sie uns wissen, wenn Sie spezielle Probleme bei der Implementierung haben. – Kevin

+2

KeyboardInterrupt ist in Ordnung, ich habe einige Open-Source-Projekte gesehen, die es tun. Was vielleicht nicht in Ordnung ist, bricht vorzeitig aus der Schleife. – mehmetminanc

+2

Sie können auch 'dill' anstelle von' pickle' verwenden (letzterer kann mit lambdas und statischen Methoden nicht umgehen). Eine weitere gute Methode besteht darin, Ihre Ergebnisse in einer Datei für jede Iteration in einer Schleife zeilenweise zu speichern. – kurtosis

Antwort

1

Es ist nur sicher, wenn Ihre Variablen bei alle Punkt in Ihrer Schleife in einem Zustand sind, in dem Sie sie speichern und später fortsetzen können.

Um sicher zu sein, könnten Sie stattdessen die KeyboardInterrupt fangen, bevor es passiert und setzen Sie eine Flagge, für die Sie testen können. Um dies zu erreichen, müssen Sie das Signal abfangen, das die KeyboardInterrupt verursacht, die SIGINT ist. In Ihrem Signal-Handler können Sie dann ein Flag setzen, nach dem Sie in Ihrer Berechnungsfunktion suchen. Beispiel:

import signal 
import time 

interrupted = False 


def on_interrupt(signum, stack): 
    global interrupted 
    interrupted = True 


def long_running_function(): 
    signal.signal(signal.SIGINT, on_interrupt) 
    while not interrupted: 
     time.sleep(1) # do your work here 
    signal.signal(signal.SIGINT, signal.SIG_DFL) 


long_running_function() 

Der entscheidende Vorteil ist, dass Sie über den Punkt verfügen, an dem die Funktion unterbrochen wird. Sie können an jedem beliebigen Ort Schecks für if interrupted hinzufügen. Dies hilft dabei, in einem konsistenten, wiederaufsetzbaren Zustand zu sein, wenn die Funktion unterbrochen wird.

(Mit python3 dieser nonlocal schöner Verwendung gelöst werden kann, dies als Übung für den Leser überlassen wird als die Asker haben nicht angegeben, an dem Python-Version sie sind.)

(Diese auf Windows nach funktionieren sollen zur Dokumentation, aber ich habe es nicht getestet.Bitte melden Sie es zurück, wenn es nicht so, dass zukünftige Leser gewarnt werden.)

+0

Danke für diese Antwort. Ich werde es heute versuchen und berichten. –

Verwandte Themen