首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用ipdb的快捷方式?

调用ipdb的快捷方式?
EN

Stack Overflow用户
提问于 2017-10-15 12:31:40
回答 3查看 745关注 0票数 1

ipdb太棒了,哇。问题是,当脚本崩溃时,我仍然需要进入代码并添加四行代码,这些行不需要大量输入,但也不需要任何内容。例如,让我们假设这是不好的行:

代码语言:javascript
复制
1 = 2

很自然,我明白了:

代码语言:javascript
复制
SyntaxError: can't assign to literal

如果出于任何原因,我想调试该行并查看该行之前发生了什么(或者此时堆栈中的其他地方),我通常会对代码行进行如下更改:

代码语言:javascript
复制
try:
    1 = 2
except:
    import traceback;traceback.print_exc()
    import ipdb;ipdb.set_trace()

这样就可以完成任务,但我希望能够以“模式”运行脚本,每当任何事情发生故障(假设异常没有得到处理)时,我都会得到相同的结果。

那是真的吗?

*编辑*

由于@np8 8的响应,我将驱动程序脚本重做如下所示(其中main是任意函数):

代码语言:javascript
复制
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,在本例中)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-06 20:22:04

您可以使用launch_ipdb_on_exception上下文管理器:

代码语言:javascript
复制
# test.py
from ipdb import launch_ipdb_on_exception

with launch_ipdb_on_exception():
    print(x)

运行上述操作将导致启动ipdb:

代码语言:javascript
复制
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>
票数 0
EN

Stack Overflow用户

发布于 2017-10-15 12:57:25

你要找的是“死后调试”。获取所需内容的最简单方法是使用

代码语言:javascript
复制
ipdb script.py

代码语言:javascript
复制
python -m pdb script.py

而不是

代码语言:javascript
复制
python script.py
票数 1
EN

Stack Overflow用户

发布于 2021-01-28 06:56:42

pm是一个函数装饰器,它反映了ipdb上下文管理器launch_ipdb_on_exception的功能。使用它来装饰一个函数,该函数将在出错时转到ipdb。名称'pm‘来自ipdb.pm()函数,它代表的是后生,其行为类似。

这样,您就可以装饰您想用@pm调试的顶级函数,并且调用堆栈中该级别或更低级别的任何异常都将触发ipdb。

代码语言:javascript
复制
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())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46755065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档