Emacs:调试Python的方法
我用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 个回答
嗯,你的方法跟我有点不一样。我没有尝试过你说的那种方式。我直接使用pdb这个库,没有用任何包装脚本,只是用“-m”这个命令行选项告诉python把这个模块当作脚本来运行。
为了详细说明一下,我的操作步骤是这样的:
- 我在EMACS中按下Alt-X,输入“pdb”,然后按回车。
- EMACS会提示我“运行pdb(像这样):”,我输入“python -m pdb myprogram.py”。
- EMACS会为pdb创建一个调试模式的窗口,我可以在这里输入调试命令,同时它会跟踪程序在源代码中的执行情况。
我想可能有某些原因导致这个方法在appengine上不太好用。我建议你先用一个简单的python程序试试看,确认能正常工作后,再尝试完整的应用。
实际上,我用pdb调试python的次数不多。我大部分的调试都是“打印调试”,也就是在我的单元测试中和(偶尔)在实际代码中插入打印语句。