这个问题我想了很久,但一直没有找到合适的解决方案。如果我运行一个脚本,遇到一个IndexError, python会打印出错误的行、位置和快速描述,然后退出。是否有可能在遇到错误时自动启动pdb ?我并不反对在文件顶部添加额外的import语句,也不反对添加几行额外的代码。
当前回答
这不是调试器,但可能同样有用(?)
我知道我听圭多在某个地方的演讲中提到过这个。
我刚刚检查了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
>>>
说实话,我没用过这个,但我应该用,看起来很有用。
其他回答
你可以使用回溯。Print_exc输出异常回溯。然后使用sys。Exc_info来提取回溯信息,最后调用pdb。带有那个回溯的Post_mortem
import pdb, traceback, sys
def bombs():
a = []
print a[0]
if __name__ == '__main__':
try:
bombs()
except:
extype, value, tb = sys.exc_info()
traceback.print_exc()
pdb.post_mortem(tb)
如果你想用code. interactive启动一个交互式命令行,使用异常产生的帧的局部变量,你可以这样做
import traceback, sys, code
def bombs():
a = []
print a[0]
if __name__ == '__main__':
try:
bombs()
except:
type, value, tb = sys.exc_info()
traceback.print_exc()
last_frame = lambda tb=tb: last_frame(tb.tb_next) if tb.tb_next else tb
frame = last_frame().tb_frame
ns = dict(frame.f_globals)
ns.update(frame.f_locals)
code.interact(local=ns)
Ipython有一个用于切换这种行为的命令:%pdb。它所做的与您所描述的完全相同,甚至可能更多(通过语法高亮显示和代码补全为您提供更多信息回溯)。这绝对值得一试!
在层次结构中最顶层异常类的构造函数中放置断点,大多数情况下您将看到哪里引发了错误。
设置断点意味着任何您想要的含义:您可以使用IDE或pdb。Set_trace之类的
这不是调试器,但可能同样有用(?)
我知道我听圭多在某个地方的演讲中提到过这个。
我刚刚检查了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():
...
推荐文章
- ValueError: numpy。Ndarray大小改变,可能表示二进制不兼容。期望从C头得到88,从PyObject得到80
- Anaconda /conda -安装特定的软件包版本
- 我在哪里调用Keras的BatchNormalization函数?
- 打印测试执行时间并使用py.test锁定缓慢的测试
- 插入一行到熊猫数据框架
- 要列出Pandas DataFrame列
- 在Django模型中存储电话号码的最佳方法是什么?
- 从导入的模块中模拟函数
- 当有命令行参数时,如何使用GDB分析程序的核心转储文件?
- 滚动或滑动窗口迭代器?
- python的方法找到最大值和它的索引在一个列表?
- 如何读取文件的前N行?
- 如何删除matplotlib中的顶部和右侧轴?
- 解析.py文件,读取AST,修改它,然后写回修改后的源代码
- Visual Studio Code:如何调试Python脚本的参数