2010-12-27 18 views
7

Publiqué esto en programmers.stackexchange.com, pero pensé que podría ser más apropiado en SO.Emacs: métodos para depurar python

Utilizo emacs para todas mis necesidades de edición de código. Por lo general, usaré Mx compile para ejecutar mi versión de prueba que, diría, me proporciona aproximadamente el 70% de lo que debo hacer para mantener el código actualizado. Sin embargo, últimamente me he estado preguntando cómo podría ser posible utilizar Mx pdb en ocasiones en las que sería bueno llegar a un punto de interrupción e inspeccionar las cosas.

En mi Google, he encontrado some things que sugieren que esto es útil/posible. Sin embargo, no he logrado que funcione de una manera que entiendo completamente.

No sé si es la combinación de buildout + appengine que podrían estar haciendo más difícil, pero cuando trato de hacer algo como

M-x pdb 
Run pdb (like this): /Users/twillis/projects/hydrant/bin/python /Users/twillis/bin/pdb /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 

Dónde .../bin/python es el intérprete buildout hace con la ruta establecida para todos los huevos.

~/bin/AP es un simple script para poner en pdb.main utilizando el actual intérprete de python

HellooKitty:hydrant twillis$ cat ~/bin/pdb 
#! /usr/bin/env python 

if __name__ == "__main__": 
    import sys 
    sys.version_info 
    import pdb 
    pdb.main() 
HellooKitty:hydrant twillis$ 

.../bin/devappserver es el guión dev_appserver que la receta hace buildout para el proyecto gae y .../piezas/boca de la aplicación es la ruta de acceso al app.yaml

estoy presentó por primera vez con un mensaje

Current directory is /Users/twillis/bin/ 
C-c C-f 

no pasa nada, pero

HellooKitty:hydrant twillis$ ps aux | grep pdb 
twillis 469 100.0 1.6 168488 67188 s002 Rs+ 1:03PM 0:52.19 /usr/local/bin/python2.5 /Users/twillis/projects/hydrant/bin/python /Users/twillis/bin/pdb /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 
twillis 477 0.0 0.0 2435120 420 s000 R+ 1:05PM 0:00.00 grep pdb 
HellooKitty:hydrant twillis$ 

algo está pasando

C-x [space] 

informará de que un punto de interrupción se ha establecido. Pero no puedo hacer que las cosas funcionen.

Parece que me falta algo obvio aquí. ¿Soy yo?

Entonces, ¿vale la pena la depuración interactiva en emacs? ¿Es posible la depuración interactiva de una aplicación appengine de google? ¿Alguna sugerencia sobre cómo puedo hacer que esto funcione?

+0

mira aquí: http://jjinux.blogspot.com/2008/05/python-debugging-google-app-engine-apps.html – systempuntoout

+0

y aquí http://code.google.com/p/googleappengine/issues/detail? id = 308 – systempuntoout

Respuesta

4

Un problema específico con GAE es que redirige STDOUT al navegador, incluida la salida del depurador.

Como se describe en el pdb documentation, el flujo de trabajo habitual es establecer un punto de interrupción en el código en el punto que lo necesita. Normalmente harías import pdb; pdb.set_trace(), pero en el caso de GAE, también querrás tomar tu STDIN y STDOUT.Por ejemplo, este fragmento de código:

def set_trace(): 
    import pdb, sys 
    debugger = pdb.Pdb(stdin=sys.__stdin__, 
     stdout=sys.__stdout__) 
    debugger.set_trace(sys._getframe().f_back) 

A continuación, iniciar un intérprete en emacs y ejecutar el código desde allí:

$ ./bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 

Para facilitar el acceso al lugar correcto en un búfer de shell-interacción en emacs, Yo uso poptoshell.el (google it, no tengo suficiente reputación para agregar otro enlace)

Finalmente, asegúrate de tener una versión suficientemente reciente del modo python para que incluya la funcionalidad pdbtrack (casi seguro que lo haces) , pero definitivamente lo quieres, ya que proporciona los medios para st ep a través del código en emacs).

+0

ah, esta podría ser la solución. Tendré que jugar con eso un poco, pero el devappserver acaparando stdin/out como dices podría ser la razón por la cual pdb simplemente cuelga en emacs para mí. gracias por la sugerencia de pdbtrack también, no estaba al tanto de eso. –

+0

aún no lo tengo completamente funcionando, pero esto definitivamente fue parte del rompecabezas. –

1

Intente usar pdb.set_trace() en su código, y luego en lugar de usar su script de controlador simplemente llame a su programa normalmente (creo que /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ debería funcionar en su caso). Debería pasar al depurador en el punto donde llama a pdb. set_trace(), y desde allí puede agregar puntos de interrupción o lo que sea necesario.