Как использовать inspect, чтобы получить информацию вызывающего абонента от вызываемого абонента в Python?


Мне нужно получить информацию о вызывающем абоненте (какой файл/какой линии) от абонента. Я узнал, что я могу использовать модуль инпек, что для целей, но не совсем так.

Как получить эту информацию с помощью inspect? Или есть другой способ получить информацию?

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 63

4 ответа:

кадр вызывающего абонента на один кадр выше, чем текущий кадр. Вы можете использовать inspect.currentframe().f_back чтобы найти кадр вызывающего абонента. Тогда используйте проверка.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)

Я бы предложил использовать 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()

я опубликовал оболочку для inspect с простой адресацией stackframe, покрывающей кадр стека одним параметром spos:

например.pysourceinfo.PySourceInfo.getCallerLinenumber(spos=1)

здесь spos=0 это lib-функция,spos=1 - это звонящего, spos=2 абонент-это абонент, и т. д.

Если вызывающий является основным файлом, просто используйте sys.argv[0]