2017-10-15 69 views
0

ipdb很棒;哇。事情是,当一个脚本爆炸时,我仍然需要进入代码并添加四行,这些行不需要输入,但也不是什么都不是。例如,让我们说这是坏线:调用ipdb的快捷方式?

1 = 2 

当然,我得到这个:

SyntaxError: can't assign to literal 

如果出于某种原因,我想调试线,看看发生了什么事情之前,只是线(或堆在那一刻别的地方),我通常会改变该行的代码如下:

try: 
    1 = 2 
except: 
    import traceback;traceback.print_exc() 
    import ipdb;ipdb.set_trace() 

也干得不错,但我很想能够在运行脚本一个“mod e“无论何时发生任何事情(假设例外情况未处理),我都会得到相同的结果。

这是否存在?

*******编辑*******

感谢@ NP8的回应,我重做了驱动程序的脚本看起来像这样(其中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的详细度参数时,例)。

回答

0

您可以使用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> 
+0

这正是我所需要的;一个缺点是必须将所有东西都嵌套在一个额外的缩进层上(因为这只存在 - 也许只能存在) - 作为上下文管理器,每个[源代码](https://github.com/gotcha/ipdb/blob /master/ipdb/__main__.py)),但是很简单,只需包装整个函数并在'with'语句中调用* that *。我会更新问题与我如何做。 – HaPsantran

0

你在找什么是“死后调试”。得到你想要的东西,最简单的方法是运行使用

ipdb script.py 

python -m pdb script.py 

,而不是

python script.py 
+0

谢谢,@dseuss,但是当我这样做,我打的异常,示踪剂使我在堆栈的最低帧,但他认为在未来一上来就是脚本的顶部(来自__future__ import print_function)。 (在我的例子中,我不再使用简单的脚本)。它是一个更长的脚本,但实际触发异常的那一行似乎不像我使用import ipdb时那样在堆栈中可用; ipdb.set_trace ()。我错过了什么吗? – HaPsantran

+0

我刚刚注意到,死后调试不能像我的方式工作,但当错误发生在任何函数之外时,就像你的情况一样。不知道发生了什么,但一个简单的解决方法是将所有内容打包到一个'main()'函数中。 – dseuss

+0

谢谢,我马上试试! – HaPsantran