답변:
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)
예외가 발생한 프레임의 로컬을 사용하여 code.interact 로 대화식 명령 행을 시작하려는 경우 수행 할 수 있습니다.
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)
code
보다 pdb
확대되는 것처럼 보이기 때문에 왜 누군가가 선호 하는가?
code
합니까?
sys.exc_info
하여 추적을 추출하고 마지막 pdb.post_mortem
으로 해당 추적을 호출하십시오 . 에 traceback 객체를 전달할 필요가 없습니다 pdb.post_mortem
. 에서 문서 : 더 추적을 지정하지 않으면, 그것은 현재 (기본값은 사용하는 경우 예외가 처리되지해야 함) 처리되고있는 예외의 하나를 사용합니다.
python -m pdb -c continue myscript.py
-c continue
플래그를 제공하지 않으면 실행이 시작될 때 '계속'에 'c'를 입력해야합니다. 그런 다음 오류 지점까지 실행되어 제어 할 수 있습니다. 마찬가지로 eqzx 언급 입력 'C'가 이전 버전 파이썬 (참조 필요하므로,이 플래그 파이썬 3.2 새로운 추가는 https://docs.python.org/3/library/pdb.html을 ).
gdb
. 에 'r'을 입력하면 pdb
프로그램은 실제로 실행되지만 오류가 발생하면 중지하지 않습니다 (역 추적을 생성하지 않습니다). 내가 이것을 읽을 때까지 당황했다. 건배!
ipdb
; 물론 스크립트 뒤에 인수를 추가 할 수 있습니다!
다음 모듈을 사용하십시오.
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
(또는 원하는대로)을 파이썬 경로의 어딘가에 넣으십시오.
이제 스크립트 시작시을 추가하십시오 import debug
.
try-catch
추한 IMO 인 모든 것을 래핑하지 않아도 됩니다.
pudb
합니다 pdb
. 내 삶의 질서 부족에 대해 분명히 말하는 복사하여 붙여 넣기로 계속 돌아가십시오.
Ipython 에는이 동작을 전환하는 명령이 있습니다 : % pdb . 그것은 당신이 묘사 한 것과 똑같이 더 잘 할 것입니다 (구문 강조 및 코드 완성으로 더 유익한 백 트레이스를 제공합니다). 시도해 볼만한 가치가 있습니다!
%debug
디버거를 열 수 있습니다 . 나는 종종 이것보다 선호한다 . (절충는 단지 입력됩니다 당신이 입력 오류 대를 디버깅하지 않으려 할 때마다 매번 할이 오류를 디버깅 할합니다.)%pdb
q
%debug
c.InteractiveShell.pdb = True
은 모든 세션 ipython_config.py
에 대해 %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)를 호출 할 수 있다는 장점이 있습니다.
처음에 c를 입력하지 않고 실행하려면 다음을 사용하십시오.
python -m pdb -c c <script name>
Pdb는 자체 명령 행 인수를 갖습니다. -cc는 실행 시작시 c (ontinue) 명령을 실행하고 오류가 발생할 때까지 프로그램이 중단없이 실행됩니다.