python打印所有函数调用以了解脚本流

时间:2017-07-09 12:28:28

标签: python stack-trace

如何打印每个功能/方法调用? 我试图使用:if let image = UIImage(named: "example.png") { if let data = UIImagePNGRepresentation(image) { let filename = getDocumentsDirectory().appendingPathComponent("copy.png") try? data.write(to: filename) } } 但它也打印函数内部代码...我只想要调用的函数名称。 在代码中使用traceback打印在调用命令本身之前调用的最后一个函数,代码包含许多类...

2 个答案:

答案 0 :(得分:4)

您可能会发现-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 :(得分: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()

如果我们在traceback.print_stack()中调用foo(),那么我们可以看到追溯到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()