Як використовувати inspect, щоб отримати інформацію про абонента від абонента в Python?


80

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

Як отримати цю інформацію за допомогою 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()

Відповіді:


99

Кадр абонента на один кадр вище поточного кадру. Ви можете використовувати, 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)

7
@prosseek: Щоб отримати абонента, що телефонує, просто змініть індекс [1]на [2]. ( inspect.getouterframesповертає список кадрів ...). Python чудово організований.
— unutbu

3
Ви також можете використовувати inspect.currentframe (). F_back.
— yoyo

Здається, це не забезпечує спосіб отримати повний шлях до імені файлу.
— Jason S

2
@JasonS: "ім'я файлу у фреймі стека відносно початкового каталогу програми".
— unutbu 02

4
Цей зразок коду працює, але працює досить погано. Якщо вас цікавить лише один кадр, а не весь слід стека, ви можете отримати попередній кадр і перевірити його на наявність інформації про кадр: filename, line_number, clsname, lines, index = inspect.getframeinfo(sys._getframe(1))
— Mouscellaneous

47

Я б запропонував використовувати 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()

Чим це краще, ніж використання, getouterframesяк запропонував @unutbu?
— ixe013

8
Він більш компактний і краще відображає намір.
— Дмитро К.

Зауважте, що getouterframes(currentframe())і stack()еквівалентно під капотом github.com/python/cpython/blob/master/Lib/inspect.py#L1442
— ubershmekel

1
Ще одна причина використання stack () приємна - вона показує, як легко отримати інші кадри. Якщо, наприклад. Вашу функцію hello () викликає спочатку інша функція, Ви можете оновити її, щоб повернутися на два рівні назад.
— Чарльз Плагер


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.