How to print each line of a script as it is run only for the top-level script being run?
python的跟踪模块将允许您运行一个脚本,打印每行代码,因为它在脚本和所有导入的模块中都运行,例如:
1 | python -m trace -trace myscript.py |
有没有办法做到这一点,但只打印顶级调用,即只打印运行时
我试图调试一个中止陷阱失败,但我不知道它在哪里死掉。不幸的是,使用完整的
我偶然发现这个问题,发现grep是一个快速而肮脏的解决方案:
1 | python -m trace --trace my_script.py | grep my_script.py |
号
不过,我的脚本在有限的时间内运行。对于更复杂的脚本来说,这可能行不通。
也许lptrace对您有用。
您可以使用decorator动态地修饰模块的所有功能(不编辑每个功能)。您只需要在脚本末尾粘贴这些行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def dump_args(func): """This decorator dumps out the arguments passed to a function before calling it""" argnames = func.func_code.co_varnames[:func.func_code.co_argcount] fname = func.func_name def echo_func(*args,**kwargs): print fname,"(", ', '.join( '%s=%r' % entry for entry in zip(argnames,args[:len(argnames)])+[("args",list(args[len(argnames):]))]+[("kwargs",kwargs)]) +")" return echo_func ### Decorate all the above functions import types for k,v in globals().items(): if isinstance(v, types.FunctionType): globals()[k] = dump_args(v) Reference, code is coming from these two answers : http://stackoverflow.com/questions/8951787/defining-python-decorators-for-a-complete-module http://stackoverflow.com/questions/6200270/decorator-to-print-function-call-details-parameters-names-and-effective-values |
如果没有回溯,可以使用称为平分的技术。
编辑你的主函数或脚本体,并在中间放置一个EDCOX1×0调用。这是第一个平分。
执行脚本。如果它到达你的出口,你知道故障在下半场。如果不是,就在上半场。
将
对于每个循环,您可以将故障的位置缩小到剩余代码的一半。
如果你把它缩小到你自己的函数中,把它二等分。
这并不完全是您想要的,但是您可以考虑使用py.test和"-s",这将阻止py.test捕获打印语句的输出…因此,您可以为脚本中的每个函数在这里和那里放置一些打印语句,并创建一个虚拟测试,该测试像往常一样执行脚本…然后你就可以看到它在哪里失败了。