当我使用IDLE运行脚本时,如果脚本遇到异常并且执行停止,那么我将留下一个交互式shell,我可以用它来调查异常时的应用程序状态。这真的很好,但我发现IDLE缺乏编辑器。有没有一种方法可以在不使用IDLE的情况下将其“放到异常交互式shell”上?
答案 0 :(得分:6)
我建议在pydev使用eclipse。它有很多调试选项,我没有看到使用shell进行调试的任何优势。试试吧,我说,你可以。
答案 1 :(得分:3)
您可以使用pdb module。
import pdb
try:
i = 0
i = i + 'a string'
except Exception, err:
pdb.set_trace()
答案 2 :(得分:2)
按如下方式运行脚本:
python -m pdb myscript.py
控制台会告诉你:
> /home/user/dir/myscript.py(2)<module>()
- &GT; first_line(of_my_script) (PDB)
输入继续
等待事情爆发:
TypeError: invalid type comparison
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /home/user/problemscript.py(567)na_op()
-> raise TypeError("invalid type comparison")
(Pdb)
从现在开始,您基本上处于MUD状态,并且适用了大量标准命令。
键入其中或 w 以查看您在堆栈中的位置:
(Pdb) w
-> return df[df['type']=='dev'][['Dist','Count']].as_matrix()
/home/user/core/ops.py(603)wrapper()
-> res = na_op(values, other)
> /home/user/core/ops.py(567)na_op()
-> raise TypeError("invalid type comparison")
看到那个小>
箭头?这就是我们在筹码中的位置。
使用列表或 l 环顾四周:
(Pdb) list
564 try:
565 result = getattr(x, name)(y)
566 if result is NotImplemented:
567 >> raise TypeError("invalid type comparison")
568 except (AttributeError):
569 -> result = op(x, y)
570
571 return result
572
573 def wrapper(self, other):
574 if isinstance(other, pd.Series):
要在堆栈中移动,请继续MUDing并使用向上( u )或向下( d )
使用 args ( a )来检查调用当前函数的参数:
(Pdb) args
dat = array([], shape=(0, 3), dtype=float64)
dev_classes = {81, 82, 21, 22, 23, 24, 31}
使用 p 打印出变量的内容(或 pp 以漂亮打印(或处理角色的基本需求)):
(Pdb) p df
Empty DataFrame
Columns: [Dist, type, Count]
Index: []
使用交互在堆栈中的当前位置输入代码。 Ctrl + D 会让您重新回到PDB。
出去!这将需要许多勇敢和强大的冒险者来扭转现在环绕城市的聚集的妖精群。你会成为击败地精王的人,为比赛夺回土地吗?
答案 3 :(得分:1)
python -i yourscript
退出时, yourscript
将退回到交互式shell。此时你可以运行:
>>> import pdb
>>> pdb.pm()
...并获得一个交互式调试shell。
答案 4 :(得分:1)
恕我直言,如果您正在使用python而不使用IPython,那么您就是在浪费时间(在字面意义上)。
在其中,只需键入“magic”命令pdb
即可打开或关闭pdb。新的qtconsole(我最喜欢的)和笔记本选项使这个杀手环境变得更好。
答案 5 :(得分:1)
从python命令解释器(import
)内部运行脚本,当出现异常时,import pdb; pdb.pm()
在调出异常后获取调试器。