Emacs: methods for debugging python

2019-04-07 06:27发布

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?

2条回答
Summer. ? 凉城
2楼-- · 2019-04-07 06:58

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).

查看更多
兄弟一词,经得起流年.
3楼-- · 2019-04-07 07:05

Try using pdb.set_trace() in your code, and then instead of using your driver script just call your program normally (I think just /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ should work in your case.) You should drop into the debugger at the point where you call pdb.set_trace(), and then from there you can add breakpoints or whatever else as needed.

查看更多
登录 后发表回答