91

我需要从被调用者那里获取调用者信息(什么文件/什么行)。我了解到我可以为此目的使用 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

4 回答 4

111

调用者的帧比当前帧高一帧。您可以使用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())

# ('/home/unutbu/pybin/test.py', 10, '<module>', ['hello()\n'], 0)
于 2010-09-14T17:12:23.247 回答
50

我建议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()
于 2014-03-13T12:16:42.673 回答
2

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

例如pysourceinfo.PySourceInfo.getCallerLinenumber(spos=1)

spos=0lib-function在哪里,spos=1是调用者,spos=2调用者的调用者等。

于 2016-07-05T20:48:02.150 回答
-5

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

于 2016-04-12T20:15:55.137 回答