¿Cómo adjunto un depurador remoto a un proceso Python?
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 puedo conectar un depurador remoto e insertar puntos de interrupción desde una interfaz de usuario civilizada?
4 answers
Use Winpdb. Es un depurador python GPL gráfico independiente de la plataforma con soporte para depuración remota a través de una red, subprocesos múltiples, modificación de espacios de nombres, depuración incrustada, 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
- Plataforma independiente, 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.
Captura de pantalla http://winpdb.org/images/screenshot_winpdb_small.jpg
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-13 05:32:18
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, obtendrás un mensaje de Python normal donde solo puedes hurgar en los datos. No es lo mismo que conseguir un rastreo enviado a un anfitrión.
Ahora, esto podría ser difícil de integrar a un programa GUI, en ese caso es posible que deba elegir otro reactor, por ejemplo para programas basados en gtk, usaba el gtk2reactor, etc.
Si desea que se envíe el seguimiento 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 de lograr usando twisted.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-12 21:07:19
Un poco tarde, pero aquí hay una solución de depuración remota muy ligera cortesía 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 permita conexiones no locales al puerto 8080 en el host remoto, ya que
epdb
por defecto escucha en cualquier dirección (INADDR_ANY
), no 127.0.0.1. - En lugar de usar
import pdb; pdb.set_trace()
en su programa, useimport epdb; epdb.serve()
. - Inicie sesión de forma segura en el host remoto, ya que
epdb.connect()
utiliza telnet. - Adjuntar al programa usando
python -c 'import epdb; epdb.connect()'
.
Ajuste los bits de seguridad para adaptarse a su configuración de red local y postura de seguridad, por supuesto.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 21:09:43
Dos soluciones de los IDE modernos:
-
Depuración remota multiplataforma de PTV
-
Depuración remota PyCharm / PyDev
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-02 15:37:29