Emacs:调试Python的方法

9 投票
1 回答
777 浏览
提问于 2025-04-16 09:15

我用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生成的解释器,路径设置了所有的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$ 

.../bin/devappserver是buildout为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应用中进行交互式调试可能吗?有没有什么建议可以让我把这个弄好?

1 个回答

4

嗯,你的方法跟我有点不一样。我没有尝试过你说的那种方式。我直接使用pdb这个库,没有用任何包装脚本,只是用“-m”这个命令行选项告诉python把这个模块当作脚本来运行。

为了详细说明一下,我的操作步骤是这样的:

  1. 我在EMACS中按下Alt-X,输入“pdb”,然后按回车。
  2. EMACS会提示我“运行pdb(像这样):”,我输入“python -m pdb myprogram.py”。
  3. EMACS会为pdb创建一个调试模式的窗口,我可以在这里输入调试命令,同时它会跟踪程序在源代码中的执行情况。

我想可能有某些原因导致这个方法在appengine上不太好用。我建议你先用一个简单的python程序试试看,确认能正常工作后,再尝试完整的应用。

实际上,我用pdb调试python的次数不多。我大部分的调试都是“打印调试”,也就是在我的单元测试中和(偶尔)在实际代码中插入打印语句。

撰写回答