2010-12-24 20 views
9

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.Emacs: métodos para depurar python

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

Esta es una pregunta para [Desbordamiento de pila] (http://www.stackoverflow.com). –

Respuesta

4

Hmm. Estás haciendo esto un poco diferente que yo. No he experimentado con tu método. Utilizo el módulo de biblioteca pdb directamente, sin script de contenedor, simplemente usando la opción de línea de comando python "-m" para decirle a python que ejecute el módulo como un script.

excesivamente minuciosa, aquí está mi secuencia de operaciones:

  1. que pulsar Alt-X en Emacs, el tipo de "AP", y luego volver.
  2. EMACS me pide con "Ejecutar pdb (como este):" y escribo "python -m pdb myprogram.py".
  3. EMACS crea una ventana de modo de depurador para pdb, donde puedo dar los comandos del depurador y rastrea la ejecución del programa en el código fuente.

Supongo que es posible que haya alguna razón por la que esto no funciona bien con el apéndice. Recomiendo que funcione primero con un programa de Python trivial y una vez que sepa que está funcionando, intente acceder a la aplicación completa.

En la práctica, no hago mucha depuración de python con pdb. La mayor parte de mi depuración es esencialmente "depuración de printf", hecho insertando instrucciones de impresión en mis pruebas de unidad y (ocasionalmente) en el código actual.

+0

gracias divegeek. Le voy a dar una oportunidad. Espero poder tener una experiencia verdaderamente integrada dentro de emacs, como usted. No tengo mucha necesidad de depuración interactiva ya que trato de mantener las pruebas unitarias actualizadas, pero de vez en cuando me he encontrado con situaciones donde la gae api no se comporta como se esperaba y preferiría ir y descubrir en un punto determinado en lugar de intentar una prueba unitaria solo para explorar la API. –