这个问题我想了很久,但一直没有找到合适的解决方案。如果我运行一个脚本,遇到一个IndexError, python会打印出错误的行、位置和快速描述,然后退出。是否有可能在遇到错误时自动启动pdb ?我并不反对在文件顶部添加额外的import语句,也不反对添加几行额外的代码。
当前回答
你可以在代码中加入这一行:
import pdb ; pdb.set_trace()
更多信息:在任意一行启动python调试器
其他回答
这不是调试器,但可能同样有用(?)
我知道我听圭多在某个地方的演讲中提到过这个。
我刚刚检查了python -?,如果您使用-i命令,您可以在脚本停止的地方进行交互。
给定这个脚本:
testlist = [1,2,3,4,5, 0]
prev_i = None
for i in testlist:
if not prev_i:
prev_i = i
else:
result = prev_i/i
您可以得到这个输出!
PS D:\> python -i debugtest.py
Traceback (most recent call last):
File "debugtest.py", line 10, in <module>
result = prev_i/i
ZeroDivisionError: integer division or modulo by zero
>>>
>>>
>>> prev_i
1
>>> i
0
>>>
说实话,我没用过这个,但我应该用,看起来很有用。
Ipdb有一个很好的上下文管理器来实现这种行为,这使得意图在语义上更清晰:
from ipdb import launch_ipdb_on_exception
with launch_ipdb_on_exception():
...
使用以下模块:
import sys
def info(type, value, tb):
if hasattr(sys, 'ps1') or not sys.stderr.isatty():
# we are in interactive mode or we don't have a tty-like
# device, so we call the default hook
sys.__excepthook__(type, value, tb)
else:
import traceback, pdb
# we are NOT in interactive mode, print the exception...
traceback.print_exception(type, value, tb)
print
# ...then start the debugger in post-mortem mode.
# pdb.pm() # deprecated
pdb.post_mortem(tb) # more "modern"
sys.excepthook = info
将其命名为debug(或任何你喜欢的名字),并将其放在python路径中的某个地方。
现在,在脚本的开头,只需添加一个导入调试。
如果您正在使用ipython,启动后键入%pdb
In [1]: %pdb
Automatic pdb calling has been turned ON
Python -m PDB script.py在python2.7中按continue start,它将运行到错误处并在那里中断以进行调试。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录