Dies wird Ihren Prozess unterbrechen (wenn Sie es in einem Thread starten), aber Sie können die code
verwenden Modul eine Python-Konsole zu starten:
import code
code.interact()
Dies blockiert, bis der Benutzer durch Ausführen exit()
die interaktive Konsole beendet.
Das Modul code
ist in mindestens Python v2.6, wahrscheinlich anderen, verfügbar.
Ich neige dazu, diesen Ansatz in Kombination mit Signalen für meine Linux-Arbeit zu verwenden (für Windows, siehe unten). Ich schlage dies an der Spitze meines Python-Skripte:
import code
import signal
signal.signal(signal.SIGUSR2, lambda sig, frame: code.interact())
Und dann auslösen aus einer Schale mit kill -SIGUSR2 <PID>
, wo <PID>
die Prozess-ID ist. Der Prozess stoppt dann, was es tut, und stellt eine Konsole:
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)
>>>
Allgemeinen von dort ich die serverseitige Komponente laden werden von einem Remote-Debugger wie das ausgezeichnete WinPDB.
Windows ist kein POSIX -kompatibles Betriebssystem und bietet daher nicht die gleichen Signale wie Linux. Python v2.2 and above expose a Windows-specific signal SIGBREAK
(ausgelöst durch Drücken von CTRL
+ Pause/Break
). Dies tut nicht interferieren mit normalen CTRL
+ C
(SIGINT
) Betrieb, und so ist eine handliche Alternative.
daher ein tragbarer, aber etwas hässlich, Version der oben ist:
import code
import signal
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR2"),
lambda sig, frame: code.interact()
)
Vorteile dieses Ansatzes:
- Keine externe Module (alle Standard-Python-Sachen)
- kaum verbraucht beliebige Ressourcen bis zum Auslösen (2x Import)
Hier ist der Code, den ich in meiner Produktionsumgebung verwende, der die Server-Seite von WinPDB lädt (falls verfügbar) und auf das Öffnen einer Python-Konsole zurückgreift.
# Break into a Python console upon SIGUSR1 (Linux) or SIGBREAK (Windows:
# CTRL+Pause/Break). To be included in all production code, just in case.
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:
# Typically: ValueError: signal only works in main thread
pass
also im Grunde ein Debugger? – st0le
etwas wie der Kommandozeilen-Interpreter python.exe –
pdb-Version: https://StackOverflow.com/Questions/25308847/attaching-a-Process-with-Pdb –