Як використовувати 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.