调用ipdb的快捷方式?
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的详细度参数时,例)。
您可以使用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>
你在找什么是“死后调试”。得到你想要的东西,最简单的方法是运行使用
ipdb script.py
或
python -m pdb script.py
,而不是
python script.py
谢谢,@dseuss,但是当我这样做,我打的异常,示踪剂使我在堆栈的最低帧,但他认为在未来一上来就是脚本的顶部(来自__future__ import print_function)。 (在我的例子中,我不再使用简单的脚本)。它是一个更长的脚本,但实际触发异常的那一行似乎不像我使用import ipdb时那样在堆栈中可用; ipdb.set_trace ()。我错过了什么吗? – HaPsantran
我刚刚注意到,死后调试不能像我的方式工作,但当错误发生在任何函数之外时,就像你的情况一样。不知道发生了什么,但一个简单的解决方法是将所有内容打包到一个'main()'函数中。 – dseuss
谢谢,我马上试试! – HaPsantran
这正是我所需要的;一个缺点是必须将所有东西都嵌套在一个额外的缩进层上(因为这只存在 - 也许只能存在) - 作为上下文管理器,每个[源代码](https://github.com/gotcha/ipdb/blob /master/ipdb/__main__.py)),但是很简单,只需包装整个函数并在'with'语句中调用* that *。我会更新问题与我如何做。 – HaPsantran