source

코드의 메서드에서 현재 콜스택 인쇄

bestscript 2022. 11. 24. 23:41

코드의 메서드에서 현재 콜스택 인쇄

Python에서는 (디버깅을 위해) 메서드 내에서 현재의 콜스택을 인쇄하려면 어떻게 해야 합니까?

다음으로 트레이스백모듈을 통해 스택을 취득하여 인쇄하는 예를 나타냅니다.

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()원하는 대로 사용할 수 있습니다.

import traceback
traceback.print_stack()

inspect.stack()는 예외 트레이스백이 아닌 현재 스택을 반환합니다.

import inspect
print inspect.stack()

log_stack 유틸리티 함수에 대해서는http://https://gist.github.com/FredLoney/5454553 를 참조해 주세요.

pdb를 사용하는 동안 콜스택을 인쇄해야 하는 경우

(Pdb) where

python 디버거를 사용하면 변수의 인터랙티브 프로빙뿐만 아니라 "where" 명령 또는 "w" 명령으로 콜 스택을 얻을 수 있습니다.

그래서 프로그램 맨 위에

import pdb

그리고 무슨 일이 일어나는지 보고 싶은 코드에서

pdb.set_trace()

프롬프트가 뜨면

원하는 기능에 선택적으로 적용할 수 있는 데코레이터를 구현한 @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

인스펙션 설치

pip3 install inspect-it --user

코드

import inspect;print(*['{:40}| {}:{}\n'.format(x.function, x.filename, x.lineno) for x in inspect.stack()])

이 줄의 일부를 만들 수 있습니다.

기능스택의 리스트와 파일명과 회선 번호가 표시됩니다.

이 행의 시작부터 시작 위치까지 나열

언급URL : https://stackoverflow.com/questions/1156023/print-current-call-stack-from-a-method-in-code