답변:
다음은 트레이스 백 모듈을 통해 스택을 가져 와서 인쇄하는 예입니다.
import traceback
def f():
g()
def g():
for line in traceback.format_stack():
print(line.strip())
f()
# Prints:
# File "so-stack.py", line 10, in <module>
# f()
# File "so-stack.py", line 4, in f
# g()
# File "so-stack.py", line 7, in g
# for line in traceback.format_stack():
실제로 스택을 stderr에만 인쇄하려면 다음을 사용할 수 있습니다.
traceback.print_stack()
또는 stdout으로 인쇄하려면 (리디렉션 된 출력을 함께 유지하려는 경우 유용) 다음을 사용하십시오.
traceback.print_stack(file=sys.stdout)
그러나 그것을 통해 얻는 traceback.format_stack()
것은 당신이 그것을 좋아하는 무엇이든 할 수 있습니다.
sys._current_frames()
. 예를 들어 py_better_exchookdump_all_thread_tracebacks
는 그렇게합니다 (면책 조항 : 나는 그것을 썼습니다).
import traceback
traceback.print_stack()
traceback.print_exc()
당신에게 except
진술 없이 얻을 수있는 것과 거의 동일한 것을 제공합니다 (그리고 받아 들인 대답보다 코딩이 적습니다).
traceback.print_exc()
처리 할 수있는 예외에 대한 스택 추적을 인쇄합니다. 그러나 이것은 원래 질문을 해결하지 못합니다. 이것은 "마지막 예외가 갔을 때 코드가 있었던 위치와 달리 현재 스택 을 인쇄하는 방법 "( 현재 위치) 꺼져 있다면. ")
inspect.stack()
예외 추적이 아닌 현재 스택을 반환합니다.
import inspect
print inspect.stack()
log_stack 유틸리티 기능에 대해서는 https://gist.github.com/FredLoney/5454553 을 참조 하십시오 .
파이썬 디버거를 사용하는 경우 대화식 변수 탐색뿐만 아니라 "where"명령 또는 "w"를 사용하여 호출 스택을 얻을 수 있습니다.
프로그램 상단에
import pdb
그런 다음 무슨 일이 일어나고 있는지보고 싶은 코드에서
pdb.set_trace()
그리고 당신은 프롬프트에 빠지게됩니다
where
있습니까?
(pdb)
그냥 입력 where
하면 스택 추적이 터미널에 인쇄됩니다.
breakpoint()
가있어 pdb를 가져올 필요가 없습니다.
다음은 @RichieHindle의 탁월한 답변의 변형으로 원하는 기능에 선택적으로 적용 할 수있는 데코레이터를 구현합니다. Python 2.7.14 및 3.6.4에서 작동합니다.
from __future__ import print_function
import functools
import traceback
import sys
INDENT = 4*' '
def stacktrace(func):
@functools.wraps(func)
def wrapped(*args, **kwds):
# Get all but last line returned by traceback.format_stack()
# which is the line below.
callstack = '\n'.join([INDENT+line.strip() for line in traceback.format_stack()][:-1])
print('{}() called:'.format(func.__name__))
print(callstack)
return func(*args, **kwds)
return wrapped
@stacktrace
def test_func():
return 42
print(test_func())
샘플 출력 :
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
Inspect-it 설치
pip3 install inspect-it --user
암호
import inspect;print(*['\n\x1b[0;36;1m| \x1b[0;32;1m{:25}\x1b[0;36;1m| \x1b[0;35;1m{}'.format(str(x.function), x.filename+'\x1b[0;31;1m:'+str(x.lineno)+'\x1b[0m') for x in inspect.stack()])
이 줄의 스 니펫을 만들 수 있습니다
파일 이름과 줄 번호 가있는 함수 호출 스택 목록이 표시됩니다
이 줄을 처음부터 끝까지 나열하십시오