source

오류 발생 시 python 디버거를 자동으로 시작하는 중

goodcode 2022. 9. 22. 00:22
반응형

오류 발생 시 python 디버거를 자동으로 시작하는 중

이것은 꽤 오랫동안 궁금했던 질문이지만, 마땅한 해결책을 찾지 못했다.스크립트를 실행하여 IndexError라고 하면 python이 행, 위치 및 오류에 대한 빠른 설명을 인쇄하여 종료합니다.오류가 발생했을 때 pdb를 자동으로 시작할 수 있습니까?파일 상단에 추가 Import 명세서가 있는 것을 반대하지 않으며, 코드 몇 줄 추가도 반대하지 않습니다.

python -m pdb -c continue myscript.py

를 입력하지 않으면-c continue실행이 시작되면 플래그를 'c'(계속)로 입력해야 합니다.그런 다음 오류 지점까지 실행되어 그곳에서 제어할 수 있습니다.eqzx에서 언급했듯이 이 플래그는 python 3.2에 새로 추가된 것이므로 이전 Python 버전에서는 'c'를 입력해야 합니다(https://docs.python.org/3/library/pdb.html) 참조).

traceback.print_exc를 사용하여 예외 트레이스백을 인쇄할 수 있습니다.그런 다음 sys.exc_info를 사용하여 트레이스백을 추출하고 마지막으로 해당 트레이스백을 사용하여 pdb.post_mortem을 호출합니다.

import pdb, traceback, sys

def bombs():
    a = []
    print a[0]

if __name__ == '__main__':
    try:
        bombs()
    except:
        extype, value, tb = sys.exc_info()
        traceback.print_exc()
        pdb.post_mortem(tb)

코드를 사용하여 대화형 명령줄을 시작하는 경우.예외가 발생한 프레임의 로컬을 사용하여 대화할 수 있습니다.

import traceback, sys, code

def bombs():
    a = []
    print a[0]

if __name__ == '__main__':
    try:
        bombs()
    except:
        type, value, tb = sys.exc_info()
        traceback.print_exc()
        last_frame = lambda tb=tb: last_frame(tb.tb_next) if tb.tb_next else tb
        frame = last_frame().tb_frame
        ns = dict(frame.f_globals)
        ns.update(frame.f_locals)
        code.interact(local=ns)

다음 모듈을 사용합니다.

import sys

def info(type, value, tb):
    if hasattr(sys, 'ps1') or not sys.stderr.isatty():
    # we are in interactive mode or we don't have a tty-like
    # device, so we call the default hook
        sys.__excepthook__(type, value, tb)
    else:
        import traceback, pdb
        # we are NOT in interactive mode, print the exception...
        traceback.print_exception(type, value, tb)
        print
        # ...then start the debugger in post-mortem mode.
        # pdb.pm() # deprecated
        pdb.post_mortem(tb) # more "modern"

sys.excepthook = info

말만 해!debug(또는 당신이 좋아하는 것을) 당신의 python 경로 어딘가에 놓아둘 수 있습니다.

스크립트의 시작 부분에 다음 명령어를 추가합니다.import debug.

Ipython에는 이 동작을 전환하기 위한 명령어 %pdb가 있습니다.설명하신 대로 동작합니다(구문 강조 표시 및 코드 완성으로 더 많은 정보를 얻을 수 있습니다).확실히 시도해 볼 만해요!

이것은 디버거는 아니지만 아마 마찬가지로 도움이 될 것이다(?).

기도가 어딘가에서 이 말을 하는 걸 들은 적이 있어요.

방금 python - ?을 확인했는데 -i 명령어를 사용하면 스크립트가 정지된 곳에서 상호작용할 수 있습니다.

이 스크립트는 다음과 같습니다.

testlist = [1,2,3,4,5, 0]

prev_i = None
for i in testlist:
    if not prev_i:
        prev_i = i
    else:
        result = prev_i/i

이 출력을 얻을 수 있습니다!

PS D:\> python -i debugtest.py
Traceback (most recent call last):
  File "debugtest.py", line 10, in <module>
    result = prev_i/i
ZeroDivisionError: integer division or modulo by zero
>>>
>>>
>>> prev_i
1
>>> i
0
>>>

솔직히 말해, 난 이걸 써본 적이 없지만, 유용하게 써야 할 것 같아.

IPython을 사용하면 명령줄에서 다음과 같이 간단하게 할 수 있습니다.

python myscript.py arg1 arg2

고쳐 쓸 수 있다

ipython --pdb myscript.py -- arg1 arg2

또는 마찬가지로 모듈을 호출하는 경우:

python -m mymodule arg1 arg2

고쳐 쓸 수 있다

ipython --pdb -m mymodule -- arg1 arg2

주의:--스크립트의 인수를 IPython이 자신의 것으로 읽는 것을 방지합니다.

또한 pdb 대신 확장 IPython 디버거(ipdb)를 호출할 수도 있습니다.

「 」를 사용하고 ipython한 후, 타입 「」를 기동합니다.%pdb

In [1]: %pdb
Automatic pdb calling has been turned ON

IPython 환경을 사용하는 경우 %debug를 사용하면 ipdb 환경의 문제행으로 돌아가 검사 등을 수행할 수 있습니다.위에서 설명한 다른 옵션은 iPython 매직 %pdb를 사용하는 것입니다.이 매직 %pdb는 실제로 같은 기능을 합니다.

처음에 c를 입력하지 않고 실행하려면 다음 명령을 사용합니다.

python -m pdb -c c <script name>

Pdb에는 자체 명령줄 인수가 있습니다. -c c는 실행 시작 시 c(ontinue) 명령을 실행하고 프로그램은 오류가 발생할 때까지 중단 없이 실행됩니다.

python -m pdb script.py in python2.7을 계속 누르면 오류가 발생하고 디버깅을 위해 중단됩니다.

코드에 다음 행을 입력할 수 있습니다.

import pdb ; pdb.set_trace()

추가 정보: 임의의 행에서 python 디버거 시작

모듈을 실행하고 있는 경우:

python -m mymodule

""를 하려고 합니다.pdb예외가 발생하면 다음을 수행합니다.

PYTHONPATH="." python -m pdb -c c mymodule/__main__.py

(또는 확장)PYTHONPATHPYTHONPATH는 모듈이 경로 위해 은, 「경로를 실행하고 있기 때문입니다.pdb모듈로 이동합니다.

ipdb 에는 이 동작을 실현하기 위한 훌륭한 콘텍스트 매니저가 있습니다.이 동작은 의미적으로 의도를 명확하게 합니다.

from ipdb import launch_ipdb_on_exception

with launch_ipdb_on_exception():
    ...

3.7 이후로는 다음과 같이 키워드 breakpoint를 코드로 직접 사용할 수 있습니다(가져오지 않고).

try:
    ...  # The line that raises an error
except:
    breakpoint()

계층 내 최상위 예외 클래스의 생성자 안에 중단점을 넣으면 대부분의 경우 오류가 발생한 위치를 볼 수 있습니다.

을 넣는 것은 즉 할 수 있습니다.IDE를 사용합니다.★★★★★★★★★★★★★★★★★★,pdb.set_trace, 「 」 「 」입니다

언급URL : https://stackoverflow.com/questions/242485/starting-python-debugger-automatically-on-error

반응형