Dies unterbricht Ihren Prozess (es sei denn, Sie starten ihn in einem Thread), aber Sie können das codeModul verwenden, um eine Python-Konsole zu starten:
import code
code.interact()
Dies wird blockiert, bis der Benutzer die interaktive Konsole durch Ausführen verlässt exit().
Das codeModul ist mindestens in Python v2.6 verfügbar, wahrscheinlich auch in anderen.
Ich neige dazu, diesen Ansatz in Kombination mit Signalen für meine Linux-Arbeit zu verwenden (für Windows siehe unten). Ich schlage dies oben in meine Python-Skripte:
import code
import signal
signal.signal(signal.SIGUSR2, lambda sig, frame: code.interact())
Und dann lösen Sie es aus einer Shell mit kill -SIGUSR2 <PID>, wo <PID>ist die Prozess-ID. Der Prozess stoppt dann alles, was er tut, und zeigt eine Konsole an:
Python 2.6.2 (r262:71600, Oct 9 2009, 17:53:52)
[GCC 3.4.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Im Allgemeinen lade ich von dort aus die serverseitige Komponente eines Remote-Debuggers wie die ausgezeichnete WinPDB .
Windows ist kein POSIX- kompatibles Betriebssystem und liefert daher nicht die gleichen Signale wie Linux. Allerdings Python v2.2 und über ein Windows-spezifisches Signal aussetzenSIGBREAK (ausgelöst durch Drücken CTRL+ Pause/Break). Dies gilt nicht bei normalen stören CTRL+ C( SIGINT) Betrieb, und so ist eine praktische Alternative.
Daher ist eine tragbare, aber etwas hässliche Version der oben genannten:
import code
import signal
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR2"),
lambda sig, frame: code.interact()
)
Vorteile dieses Ansatzes:
- Keine externen Module (alles Standard-Python-Zeug)
- Verbraucht bis zur Auslösung kaum Ressourcen (2x Import)
Hier ist der Code, den ich in meiner Produktionsumgebung verwende, der die Serverseite von WinPDB (falls verfügbar) lädt und auf das Öffnen einer Python-Konsole zurückgreift.
def debug_signal_handler(signal, frame):
del signal
del frame
try:
import rpdb2
print
print
print "Starting embedded RPDB2 debugger. Password is 'foobar'"
print
print
rpdb2.start_embedded_debugger("foobar", True, True)
rpdb2.setbreak(depth=1)
return
except StandardError:
pass
try:
import code
code.interact()
except StandardError as ex:
print "%r, returning to normal program flow" % ex
import signal
try:
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR1"),
debug_signal_handler
)
except ValueError:
pass