이것은 내가 오랫동안 궁금해 한 질문이지만 적절한 해결책을 찾지 못했습니다. 스크립트를 실행하고 IndexError라고 가정하면 Python은 오류의 줄, 위치 및 빠른 설명을 인쇄하고 종료합니다. 오류가 발생하면 pdb를 자동으로 시작할 수 있습니까? 파일 맨 위에 여분의 import 문을 사용하거나 몇 줄의 추가 코드를 작성하는 것에 반대하지 않습니다.
답변
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)
답변
python -m pdb -c continue myscript.py
-c continue
플래그를 제공하지 않으면 실행이 시작될 때 ‘계속’에 ‘c’를 입력해야합니다. 그런 다음 오류 지점까지 실행되어 제어 할 수 있습니다. 마찬가지로 eqzx 언급 입력 ‘C’가 이전 버전 파이썬 (참조 필요하므로,이 플래그 파이썬 3.2 새로운 추가는 https://docs.python.org/3/library/pdb.html을 ).
답변
다음 모듈을 사용하십시오.
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
.
답변
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