inspect를 사용하여 Python에서 수신자로부터 호출자의 정보를 얻는 방법은 무엇입니까?


80

수신자로부터 발신자 정보 (어떤 파일 / 어떤 줄)를 받아야합니다. 나는 목적을 위해 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()

답변:


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

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 2014 년

8
더 간결하고 의도를 더 잘 반영합니다.
Dmitry K.

참고 getouterframes(currentframe())stack()후드 동일 github.com/python/cpython/blob/master/Lib/inspect.py#L1442
ubershmekel

1
stack ()을 사용하는 또 다른 이유는 다른 프레임을 쉽게 얻는 방법을 보여주기 때문입니다. 예를 들어. hello () 함수가 다른 함수에 의해 먼저 호출되면 두 수준 뒤로 이동하도록 업데이트 할 수 있습니다.
Charles Plager


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.