Ich habe ein Modul, das ich für solche Situationen verwende - wenn ein Prozess lange Zeit läuft, aber manchmal aus unbekannten und nicht reproduzierbaren Gründen stecken bleibt. Es ist ein bisschen hacky, und funktioniert nur auf 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 einfach die listen()-Funktion zu einem bestimmten Zeitpunkt auf, wenn Ihr Programm startet (Sie könnten sie sogar in site.py einfügen, damit alle Python-Programme sie verwenden), und lassen Sie sie laufen. Zu jedem beliebigen Zeitpunkt senden Sie dem Prozess ein SIGUSR1-Signal, indem Sie kill oder in Python:
os.kill(pid, signal.SIGUSR1)
Dies führt dazu, dass das Programm an dem Punkt, an dem es sich gerade befindet, in eine Python-Konsole umbricht, die Ihnen den Stack-Trace anzeigt und Ihnen die Möglichkeit gibt, die Variablen zu manipulieren. Verwenden Sie control-d (EOF), um die Ausführung fortzusetzen (beachten Sie jedoch, dass Sie wahrscheinlich alle E/A usw. an dem Punkt unterbrechen, an dem Sie das Signal geben, so dass es nicht völlig unauffällig ist.
Ich habe ein anderes Skript, das dasselbe tut, nur dass es mit dem laufenden Prozess über eine Pipe kommuniziert (um das Debuggen von Prozessen im Hintergrund usw. zu ermöglichen). Es ist ein bisschen groß, um es hier zu posten, aber ich habe es als python kochbuch rezept .