Answers:
您可以使用traceback.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.interact启动交互式命令行,可以执行
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)
code
了,为什么有人会喜欢pdb
呢?
code
?
sys.exc_info
提取回溯,最后pdb.post_mortem
使用该回溯调用。您无需将traceback对象传递给pdb.post_mortem
。来自docs:如果未提供回溯,它将使用当前正在处理的异常之一(如果要使用默认值,则必须处理异常)。
python -m pdb -c continue myscript.py
如果不提供-c continue
标志,则在执行开始时需要输入“ c”(代表“继续”)。然后它将运行到错误点,并在那里给您控制。如eqzx所述,此标志是python 3.2中的新增功能,因此,对于早期的Python版本,请输入'c'(请参阅https://docs.python.org/3/library/pdb.html)。
gdb
;当您在中输入'r'时pdb
,程序确实可以运行,但是不会因错误而停止(也不生成回溯);让我感到困惑,直到我读到这篇文章。干杯!
ipdb
; 当然可以在脚本之后添加参数!
使用以下模块:
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路径中的某个位置。
现在,在脚本的开头,只需添加一个即可import debug
。
try-catch
IMO中。
pudb
了pdb
。继续回到复制粘贴,这肯定说明了我一生中缺乏秩序。
这不是调试器,但可能同样有用(?)
我知道我听到Guido在某处的演讲中提到了这一点。
我刚刚检查了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
>>>
老实说,我没有使用过,但是应该使用,这似乎很有用。
要使其运行而不必在开始使用时键入c:
python -m pdb -c c <script name>
Pdb有其自己的命令行参数:-cc将在执行开始时执行c(ontinue)命令,并且程序将不间断运行直至出现错误。