¿Cómo adjunto un depurador remoto a un proceso de Python?
-
23-08-2019 - |
Pregunta
Estoy cansado de insertar
import pdb; pdb.set_trace()
líneas en mis programas Python y depuración a través de la consola.¿Cómo conecto un depurador remoto e inserto puntos de interrupción desde una interfaz de usuario civilizada?
Solución
usar Winpdb.Es un plataforma independiente Depurador gráfico GPL Python con soporte para depuración remota a través de una red, múltiples subprocesos, modificación del espacio de nombres, depuración integrada, comunicación cifrada y es hasta 20 veces más rápido que pdb.
Características:
- Licencia GPL.Winpdb es software libre.
- Compatible con CPython 2.3 a 2.6 y Python 3000
- Compatible con wxPython 2.6 a 2.8
- Independiente de la plataforma y probado en Ubuntu Gutsy y Windows XP.
- Interfaces de usuario:rpdb2 está basado en consola, mientras que winpdb requiere wxPython 2.6 o posterior.
(fuente: winpdb.org)
Otros consejos
Bueno, puedes obtener algo bastante similar a eso usando una alcantarilla retorcida, que funciona así:
from twisted.internet import reactor
from twisted.cred import portal, checkers
from twisted.conch import manhole, manhole_ssh
def getManholeFactory(namespace):
realm = manhole_ssh.TerminalRealm()
def getManhole(_):
return manhole.Manhole(namespace)
realm.chainedProtocolFactory.protocolFactory = getManhole
p = portal.Portal(realm)
p.registerChecker(
checkers.InMemoryUsernamePassword DatabaseDontUse(admin='foobar'))
f = manhole_ssh.ConchFactory(p)
return f
reactor.listenTCP(2222, getManholeFactory(globals()))
reactor.run()
Luego simplemente inicia sesión en el programa a través de ssh;
$ ssh admin@localhost -p 2222
admin@localhost's password:
Usando Foobar como contraseña.
Cuando inicies sesión, recibirás un mensaje normal de Python donde podrás acceder a los datos.No es lo mismo que enviar un rastreo a un host.
Ahora bien, esto puede ser complicado de integrar a un programa GUI, en ese caso es posible que deba elegir otro reactor, por ejemplo, para programas basados en gtk se usa gtk2reactor, etc.
Si desea que se envíe el rastreo real, debe crear un canal de socket para stderr, stdin y stdout que pase por la red en lugar de imprimir en su host local.No debería ser demasiado difícil lograrlo usando retorcido.
Un poco tarde, pero aquí es una solución de depuración remota de cortesía muy ligero de http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible :
-
pip install epdb
en el host remoto. - Asegúrese de que su configuración de cortafuegos no permite conexiones no locales al puerto 8080 en el host remoto, ya que por defecto
epdb
a escuchar en cualquier dirección (INADDR_ANY
), no 127.0.0.1. - En lugar de utilizar
import pdb; pdb.set_trace()
en su programa,import epdb; epdb.serve()
uso. - segura inicie sesión en el host remoto, desde
epdb.connect()
utiliza telnet. - Adjuntar al programa usando
python -c 'import epdb; epdb.connect()'
.
Ajustar los bits de seguridad para adaptarse a su posición de instalación y seguridad de la red local, por supuesto.
Dos soluciones de IDE modernos:
Depuración remota multiplataforma PTVS
Depuración remota de PyCharm/PyDev