Emacs:Python调试方法

7

我将这个问题发布在programmers.stackexchange.com上,但我认为在SO上更加合适。

我使用emacs进行所有的编程工作。通常情况下,我会使用M-x compile运行测试运行程序,这大约可以满足我完成代码调试的70%需求,但最近我一直在思考如何在需要时使用M-x pdb来打断点并进行检查。

在我的搜索中,我找到了一些资料表明这是有用/可能的。然而,我没有找到能够完全理解并使其正常工作的方法。

我不知道是buildout + appengine的组合使得它更加困难,但当我尝试执行类似以下操作时

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/

这里的“.../bin/python”是使用路径设置所有依赖包后由buildout生成的解释器。

“~/bin/pdb”是一个简单的脚本,用于调用当前Python解释器中的pdb.main函数。

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是gae项目生成的buildout recipe脚本,.../parts/hydrant-app是app.yaml的路径。

我首先会看到一个提示。

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

什么也不发生,但是

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$ 

有事情正在发生

C-x [space]

将报告已设置断点。但我无法使事情进展。

感觉好像我错过了什么显而易见的东西。是吗?

那么,在emacs中进行交互式调试是否值得?在google appengine应用程序中进行交互式调试是否可行?您有任何建议,我如何使其工作?


请查看这里:http://jjinux.blogspot.com/2008/05/python-debugging-google-app-engine-apps.html - systempuntoout
请在此处查看相关编程内容:http://code.google.com/p/googleappengine/issues/detail?id=308 - systempuntoout
2个回答

4

GAE存在一个特定的问题,即它会将STDOUT重定向到浏览器,包括调试输出。

正如pdb文档所概述的那样,通常的工作流程是在需要的代码中设置断点。 通常你会这样做:import pdb; pdb.set_trace(),但在GAE的情况下,您还需要获取STDIN和STDOUT。例如,以下代码片段:

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

然后在emacs中启动一个shell,并从那里运行您的代码:

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

为了方便在emacs的shell交互缓冲区中快速找到正确位置,我使用poptoshell.el插件(请自行搜索,由于我的声望不足无法添加链接)。
最后,确保你拥有足够新的python-mode版本,以包含pdbtrack功能(你几乎肯定已经拥有它,但你一定想要它,因为它提供了在emacs中逐步执行代码的方法)。

啊,这可能就是解决方案啊。我得再试试它,但是像你说的那样,devappserver捕获stdin/out可能是导致我在emacs中使用pdb时出现停顿的原因。感谢你提供pdbtrack建议,我之前不知道这个功能。 - Tom Willis
我还没有完全搞定这个,但这绝对是谜题的一部分。 - Tom Willis
对于那些仅通过pdb搜索进入的人来说,“GAE”指的是“Google App Engine”。 - Lorem Ipsum

1
尝试在您的代码中使用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接