Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Emacs: methods for debugging python

I posted this on programmers.stackexchange.com, but I figured it may be more appropriate on SO.

I use emacs for all my code edit needs. Typically, I will use M-x compile to run my test runner which I would say gets me about 70% of what I need to do to keep the code on track however lately I've been wondering how it might be possible to use M-x pdb on occasions where it would be nice to hit a breakpoint and inspect things.

In my googling I've found some things that suggest that this is useful/possible. However I have not managed to get it working in a way that I fully understand.

I don't know if it's the combination of buildout + appengine that might be making it more difficult but when I try to do something like

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/

Where .../bin/python is the interpreter buildout makes with the path set for all the eggs.

~/bin/pdb is a simple script to call into pdb.main using the current python interpreter

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 is the dev_appserver script that the buildout recipe makes for gae project and .../parts/hydrant-app is the path to the app.yaml

I am first presented with a prompt

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

Nothing happens but

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$ 

something is happening

C-x [space]

will report that a breakpoint has been set. But I can't manage to get get things going.

It feels like I am missing something obvious here. Am I?

So, is interactive debugging in emacs worthwhile? is interactive debugging a google appengine app possible? Any suggestions on how I might get this working?

like image 269
Tom Willis Avatar asked Dec 27 '10 23:12

Tom Willis


People also ask

What is Emacs Python?

Emacs (source code) is an extensible text editor that can be customized by writing Emacs Lisp (Elisp) code.


1 Answers

A specific problem with GAE is that it redirects STDOUT to the browser, including debugger output.

As outlined in the pdb documentation, the usual workflow is to set a breakpoint in code at the point you need it. Normally you'd do import pdb; pdb.set_trace(), but in the case of GAE, you'll also want to grab your STDIN and STDOUT. For example, this code snippet:

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

Then start a shell in emacs and run your code from there:

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

For easy access to the right place in a shell-interaction buffer in emacs, I use poptoshell.el (google it, I don't have sufficient reputation to add another link)

Finally, make sure you have a recent enough version of python-mode such that it includes pdbtrack functionality (you almost certainly do, but you definitely want it, as it provides the means to step through code in emacs).

like image 165
seb Avatar answered Sep 28 '22 19:09

seb