Esto interrumpirá el proceso (a menos que se inicia en un hilo), pero se puede utilizar el code
módulo para iniciar una consola Python:
import code
code.interact()
Esto bloqueará hasta que el usuario sale de la consola interactiva mediante la ejecución de exit()
.
El módulo code
está disponible al menos en Python v2.6, probablemente en otros.
Tiendo a utilizar este enfoque en combinación con señales para mi trabajo con Linux (para Windows, ver a continuación). Bofetada esta en la parte superior de mis scripts de Python:
import code
import signal
signal.signal(signal.SIGUSR2, lambda sig, frame: code.interact())
Y luego dispararlo desde un shell con kill -SIGUSR2 <PID>
, donde <PID>
es el ID del proceso. El proceso se detiene lo que está haciendo y presenta una consola:
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)
>>>
general a partir de ahí voy a cargar el componente del lado del servidor de un depurador remoto como la excelente WinPDB.
Windows no es un sistema operativo compatible con POSIX, por lo que no proporciona las mismas señales que Linux. Sin embargo, Python v2.2 and above expose a Windows-specific signal SIGBREAK
(activado presionando CTRL
+ Pause/Break
). Esto hace que no interfiera con el funcionamiento normal de CTRL
+ C
(SIGINT
), por lo que es una alternativa práctica.
Por lo tanto un portátil, pero un poco fea, la versión de lo anterior es:
import code
import signal
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR2"),
lambda sig, frame: code.interact()
)
ventajas de este enfoque:
- No hay módulos externos (todas las cosas estándar de Python)
- consume apenas cualquier recurso hasta que se active (2x importación)
Este es el código que uso en mi entorno de producción que cargará el lado del servidor de WinPDB (si está disponible) y volverá a abrir una consola de Python.
# 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
¿básicamente, un depurador? – st0le
algo así como el intérprete de línea de comandos python.exe –
versión pdb: https://stackoverflow.com/questions/25308847/attaching-a-process-with-pdb –