2017-07-09 31 views
2

如何打印每个函数/方法调用? 我试图使用:python -m trace --trace,但它也打印函数内部代码...我只想要调用的函数名称。 在代码中使用回溯打印在调用命令本身之前调用的最后一个函数,并且代码包含许多类...python打印所有函数调用以知道脚本流程

回答

2

您可能会发现-l有用。

main.py:

def foo(): 
    pass 

def bar(): 
    pass 

foo() 
bar() 

$ python -m trace -l main.py 

输出

functions called: 
filename: C:\Python34\lib\trace.py, modulename: trace, funcname: _unsettrace 
filename: main.py, modulename: main, funcname: <module> 
filename: main.py, modulename: main, funcname: bar 
filename: main.py, modulename: main, funcname: foo 

根据功能多少你有,你可能会发现一个装饰更适合:

def print_deco(func): 
    def inner(*args, **kwargs): 
     print(func.__name__) 
     return func(*args, **kwargs) 
    return inner 

@print_deco 
def foo(): 
    pass 

@print_deco 
def bar(): 
    pass 

foo() 
bar() 

# foo 
# bar 
+1

'蟒蛇-m按照字母顺序而不是调用顺序跟踪-l main.py'prints。 添加装饰器不是一个选项...太多的函数和类,我没有写代码。谢谢 –

1

这里是名字player.py的代码。

# player.py 
def foo(): 
    pass 
def bar(): 
    foo() 
def car(): 
    bar() 
    pass 
car() 

执行从像$python -m trace -T player.py的终端的命令,这让我下面的输出。对于相同的输出,您也可以使用--trackcalls而不是-T。并且该命令显示通过运行该程序暴露的调用关系。

calling relationships: 

*** /usr/lib/python2.7/trace.py *** 
    trace.Trace.runctx -> trace._unsettrace 
    --> player.py 
    trace.Trace.runctx -> player.<module> 

*** player.py *** 
    player.<module> -> player.car 
    player.bar -> player.foo 
    player.car -> player.bar 

希望这会有所帮助。

更新1:

上述命令显示功能的关系。

为了跟踪功能,我们可以使用traceback模块。在这个模块traceback.print_stack()根据执行打印功能。但是我们必须记住,在我们编写traceback.print_stack()的方法中,它只会打印该函数的轨迹。我会给你一个例子。

import traceback 
def foo(): 
    car() 
    pass 
def bar(): 
    foo() 
def car(): 
    traceback.print_stack() 
    pass 
bar() 

如果我们运行这个,我们可以看到下面的输出。

File "D:/python_practice36/player.py", line 10, in <module> 
bar() 
File "D:/python_practice36/player.py", line 6, in bar 
foo() 
File "D:/python_practice36/player.py", line 3, in foo 
car() 
File "D:/python_practice36/player.py", line 8, in car 
traceback.print_stack() 

如果我们称之为foo()traceback.print_stack()那么我们可以看到追溯高达foo

import traceback 
def foo(): 
    car() 
    traceback.print_stack() 
    pass 
def bar(): 
    foo() 
def car(): 
    pass 
bar() 

和输出

File "D:/python_practice36/player.py", line 10, in <module> 
bar() 
File "D:/python_practice36/player.py", line 7, in bar 
foo() 
File "D:/python_practice36/player.py", line 4, in foo 
traceback.print_stack()