关于python:如何打印脚本的每一行,因为它只针对正在运行的顶级脚本运行?

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

有没有办法做到这一点,但只打印顶级调用,即只打印运行时myscript.py中的行?

我试图调试一个中止陷阱失败,但我不知道它在哪里死掉。不幸的是,使用完整的--trace需要很长时间——脚本通常需要2-3分钟才能运行,完整的跟踪已经持续了几个小时。


我偶然发现这个问题,发现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调用。这是第一个平分。

执行脚本。如果它到达你的出口,你知道故障在下半场。如果不是,就在上半场。

exit移动到上半部分或下半部分的一半,然后重试。

对于每个循环,您可以将故障的位置缩小到剩余代码的一半。

如果你把它缩小到你自己的函数中,把它二等分。


这并不完全是您想要的,但是您可以考虑使用py.test和"-s",这将阻止py.test捕获打印语句的输出…因此,您可以为脚本中的每个函数在这里和那里放置一些打印语句,并创建一个虚拟测试,该测试像往常一样执行脚本…然后你就可以看到它在哪里失败了。