【问题标题】:Emacs: methods for debugging pythonEmacs:调试python的方法
【发布时间】:2010-12-27 23:11:13
【问题描述】:

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

我使用 emacs 来满足我所有的代码编辑需求。通常,我会使用 M-x compile 来运行我的测试运行程序,我会说这可以让我完成大约 70% 的工作来保持代码正常运行,但是最近我一直想知道如何使用 M-x pdb on打断点并检查东西会很好的场合。

在我的谷歌搜索中,我发现some things 表明这是有用/可能的。但是,我还没有设法让它以我完全理解的方式工作。

我不知道是不是 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 是解释器构建使用为所有鸡蛋设置的路径。

~/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 项目制作的 dev_appserver 脚本,.../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 应用程序?关于如何让这个工作的任何建议?

【问题讨论】:

标签: python google-app-engine emacs


【解决方案1】:

GAE 的一个具体问题是它将 STDOUT 重定向到浏览器,包括调试器输出。

正如pdb documentation 中所述,通常的工作流程是在代码中您需要的位置设置断点。通常你会使用import pdb; pdb.set_trace(),但在 GAE 的情况下,你还需要获取你的 STDIN 和 STDOUT。比如这段代码sn -p:

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 可能是 pdb 对我来说只是挂在 emacs 中的原因。也感谢 pdbtrack 的建议,我不知道。
  • 我还没有完全做到这一点,但这绝对是难题的一部分。
  • “GAE”对于通过严格的 pdb 搜索获得此信息的任何人来说都是“Google App Engine”。
【解决方案2】:

尝试在您的代码中使用pdb.set_trace(),而不是使用您的驱动程序脚本,只需正常调用您的程序(我认为/Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 应该适用于您的情况。)您应该在您所在的位置进入调试器调用 pdb.set_trace(),然后可以根据需要添加断点或其他任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多