Как использовать inspect для получения информации о вызывающем абоненте от вызываемого в Python? - PullRequest
68 голосов
/ 14 сентября 2010

Мне нужно получить информацию о вызывающем абоненте (какой файл / какая строка) от вызываемого. Я узнал, что могу использовать модуль 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 ]

83 голосов
/ 14 сентября 2010

Кадр вызывающего абонента на один кадр выше текущего кадра. Вы можете использовать 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)
42 голосов
/ 13 марта 2014

Я бы предложил использовать 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()
1 голос
/ 05 июля 2016

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

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

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

0 голосов
/ 12 апреля 2016

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

...