오류 발생 시 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
'source' 카테고리의 다른 글
| JavaScript가 멀티스레딩을 지원하지 않는 이유는 무엇입니까? (0) | 2022.09.22 |
|---|---|
| JS 개체를 폼 데이터로 변환 (0) | 2022.09.22 |
| MySQL 행 형식:고정과 동적의 차이점 (0) | 2022.09.22 |
| java.util을 변환하고 있습니다.해시맵 속성 (0) | 2022.09.22 |
| 그룹별 오브젝트 인쇄 방법 (0) | 2022.09.22 |