Ich habe ein Modul, das ich für Situationen wie diese verwende - in denen ein Prozess lange läuft, aber manchmal aus unbekannten und nicht reproduzierbaren Gründen stecken bleibt. Es ist ein bisschen hackig und funktioniert nur unter Unix (erfordert Signale):
import code, traceback, signal
def debug(sig, frame):
"""Interrupt running process, and provide a python prompt for
interactive debugging."""
d={'_frame':frame} # Allow access to frame object.
d.update(frame.f_globals) # Unless shadowed by global
d.update(frame.f_locals)
i = code.InteractiveConsole(d)
message = "Signal received : entering python shell.\nTraceback:\n"
message += ''.join(traceback.format_stack(frame))
i.interact(message)
def listen():
signal.signal(signal.SIGUSR1, debug) # Register handler
Rufen Sie zur Verwendung einfach die Funktion listen () auf, wenn Ihr Programm gestartet wird (Sie können es sogar in site.py einfügen, damit alle Python-Programme es verwenden), und lassen Sie es laufen. Senden Sie dem Prozess jederzeit ein SIGUSR1-Signal mit kill oder in Python:
os.kill(pid, signal.SIGUSR1)
Dies führt dazu, dass das Programm an der Stelle, an der es sich gerade befindet, zu einer Python-Konsole wechselt, die Stapelverfolgung anzeigt und Sie die Variablen bearbeiten können. Verwenden Sie control-d (EOF), um die Ausführung fortzusetzen (beachten Sie jedoch, dass Sie wahrscheinlich alle E / A usw. an dem von Ihnen signalisierten Punkt unterbrechen werden, damit es nicht vollständig aufdringlich ist.
Ich habe ein anderes Skript, das dasselbe tut, außer dass es über eine Pipe mit dem laufenden Prozess kommuniziert (um das Debuggen von Hintergrundprozessen usw. zu ermöglichen). Es ist ein bisschen groß, hier zu posten, aber ich habe es als Python-Kochbuchrezept hinzugefügt .