How to use inspect to get the caller's info from callee in Python?

Solution 1:

The caller's frame is one frame higher than the current frame. You can use inspect.currentframe().f_back to find the caller's frame. Then use inspect.getframeinfo to get the caller's filename and line number.

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)

Solution 2:

I would suggest to use inspect.stack instead:

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()

Solution 3:

I published a wrapper for inspect with simple stackframe addressing covering the stack frame by a single parameter spos:

  • https://pypi.python.org/pypi/pysourceinfo/
  • https://pythonhosted.org/pysourceinfo/

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

where spos=0 is the lib-function, spos=1 is the caller, spos=2 the caller-of-the-caller, etc.