Emacs:调试python的方法

Tom*_*lis 7 python emacs google-app-engine

我在programmers.stackexchange.com上发布了这个,但我认为它可能更适合SO.

我使用emacs来满足我的所有代码编辑需求.通常情况下,我会使用Mx编译来运行我的测试运行器,我会说我得到了大约70%的我需要做的事情,以保持代码正常,但最近我一直想知道如何使用Mx 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/
Run Code Online (Sandbox Code Playgroud)

其中.../bin/python是解释器buildout使用为所有egg设置的路径.

〜/ 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$ 
Run Code Online (Sandbox Code Playgroud)

.../bin/devappserver是buildout配方为gae项目制作的dev_appserver脚本,而.../parts/hydrant-app是app.yaml的路径

我第一次收到提示

Current directory is /Users/twillis/bin/
C-c C-f
Run Code Online (Sandbox Code Playgroud)

什么都没发生,但是

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$ 
Run Code Online (Sandbox Code Playgroud)

事情正在发生

C-x [space]
Run Code Online (Sandbox Code Playgroud)

将报告已设置断点.但我无法让事情顺利进行.

感觉我在这里遗漏了一些明显的东西.我呢?

那么,emacs中的交互式调试值得吗?可以互动调试谷歌appengine应用程序吗?关于我如何使这个工作的任何建议?

seb*_*seb 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)
Run Code Online (Sandbox Code Playgroud)

然后在 emacs 中启动 shell 并从那里运行代码:

$ ./bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/
Run Code Online (Sandbox Code Playgroud)

为了轻松访问 emacs 中 shell 交互缓冲区中的正确位置,我使用 poptoshell.el (谷歌搜索,我没有足够的声誉来添加另一个链接)

最后,确保您拥有足够新的 python 模式版本,使其包含 pdbtrack 功能(您几乎肯定会这样做,但您肯定需要它,因为它提供了在 emacs 中单步执行代码的方法)。