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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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