ipdb太棒了,哇。问题是,当脚本崩溃时,我仍然需要进入代码并添加四行代码,这些行不需要大量输入,但也不需要任何内容。例如,让我们假设这是不好的行:
1 = 2很自然,我明白了:
SyntaxError: can't assign to literal如果出于任何原因,我想调试该行并查看该行之前发生了什么(或者此时堆栈中的其他地方),我通常会对代码行进行如下更改:
try:
1 = 2
except:
import traceback;traceback.print_exc()
import ipdb;ipdb.set_trace()这样就可以完成任务,但我希望能够以“模式”运行脚本,每当任何事情发生故障(假设异常没有得到处理)时,我都会得到相同的结果。
那是真的吗?
*编辑*
由于@np8 8的响应,我将驱动程序脚本重做如下所示(其中main是任意函数):
if __name__ == "__main__":
start = time.time()
args = parser.parse_args()
if args.verbosity > 1:
from ipdb import launch_ipdb_on_exception
with launch_ipdb_on_exception():
print("Launching ipdb on exception!")
main(start, args)
else:
print("NOT launching ipdb on exception!")
main(start, args)这允许我从命令行确定异常是否应该启动ipdb (即当我正在开发时)(即当脚本在生产中运行时,因此在下面有一个冗长的参数2,在本例中)。
发布于 2017-11-06 20:22:04
您可以使用launch_ipdb_on_exception上下文管理器:
# test.py
from ipdb import launch_ipdb_on_exception
with launch_ipdb_on_exception():
print(x)运行上述操作将导致启动ipdb:
python .\test.py
NameError("name 'x' is not defined",)
> c:\tmp\delete_me\test.py(4)<module>()
2
3 with launch_ipdb_on_exception():
----> 4 print(x)
ipdb>发布于 2017-10-15 12:57:25
你要找的是“死后调试”。获取所需内容的最简单方法是使用
ipdb script.py或
python -m pdb script.py而不是
python script.py发布于 2021-01-28 06:56:42
pm是一个函数装饰器,它反映了ipdb上下文管理器launch_ipdb_on_exception的功能。使用它来装饰一个函数,该函数将在出错时转到ipdb。名称'pm‘来自ipdb.pm()函数,它代表的是后生,其行为类似。
这样,您就可以装饰您想用@pm调试的顶级函数,并且调用堆栈中该级别或更低级别的任何异常都将触发ipdb。
import ipdb
class Decontext(object):
"""
Makes a context manager also act as decorator
"""
def __init__(self, context_manager):
self._cm = context_manager
def __enter__(self):
return self._cm.__enter__()
def __exit__(self, *args, **kwds):
return self._cm.__exit__(*args, **kwds)
def __call__(self, func):
def wrapper(*args, **kwds):
with self:
return func(*args, **kwds)
return wrapper
pm = Decontext(ipdb.launch_ipdb_on_exception())https://stackoverflow.com/questions/46755065
复制相似问题