如何使用inspect来从python中获取调用者的信息?

时间:2010-09-14 17:04:21

标签: python inspect

我需要从callee获取调用者信息(什么文件/什么行)。我了解到我可以使用inpect模块来达到目的,但不完全是如何。

如何通过检查获取这些信息?或者有没有其他方法来获取信息?

import inspect

print __file__
c=inspect.currentframe()
print c.f_lineno

def hello():
    print inspect.stack
    ?? what file called me in what line?

hello()

4 个答案:

答案 0 :(得分:82)

来电者的帧比当前帧高一帧。您可以使用inspect.currentframe().f_back查找来电者的相框。 然后使用inspect.getframeinfo获取呼叫者的文件名和行号。

import inspect

def hello():
    previous_frame = inspect.currentframe().f_back
    (filename, line_number, 
     function_name, lines, index) = inspect.getframeinfo(previous_frame)
    return (filename, line_number, function_name, lines, index)

print(hello())

# (<frame object at 0x8ba7254>, '/home/unutbu/pybin/test.py', 10, '<module>', ['hello()\n'], 0)

答案 1 :(得分:42)

我建议改为使用inspect.stack

import inspect

def hello():
    frame,filename,line_number,function_name,lines,index = inspect.stack()[1]
    print(frame,filename,line_number,function_name,lines,index)
hello()

答案 2 :(得分:1)

我发布了一个用于检查的包装器,其中简单的堆栈帧寻址通过单个参数spos覆盖堆栈帧:

E.g。 pysourceinfo.PySourceInfo.getCallerLinenumber(spos=1)

其中spos=0是lib函数,spos=1是调用者,spos=2是调用者的调用者,等等。

答案 3 :(得分:-5)

如果调用者是主文件,只需使用sys.argv [0]