파이썬 디버깅을위한 가장 좋은 팁은 무엇입니까?
실제로 할 수있는 일을 말하지 않고 특정 디버거를 나열하지 마십시오.
관련
- 파이썬 코드를 처음으로 실행시키는 좋은 방법은 무엇입니까? -오류 최소화에 대해 설명합니다.
파이썬 디버깅을위한 가장 좋은 팁은 무엇입니까?
실제로 할 수있는 일을 말하지 않고 특정 디버거를 나열하지 마십시오.
답변:
pdb 모듈을 사용하여 pdb.set_trace()
어디에서나 삽입 할 수 있으며 중단 점으로 작동합니다.
>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)
실행을 계속하려면 c
(또는 cont
또는 continue
)를 사용하십시오.
pdb를 사용하여 임의의 파이썬 표현식을 실행할 수 있습니다. 예를 들어 실수를 발견 한 경우 코드를 수정 한 다음 실행중인 코드에서 동일한 효과를 갖도록 유형 표현식을 입력 할 수 있습니다.
ipdb는 IPython 용 pdb 버전입니다 . 탭 완성을 포함한 모든 IPython 기능과 함께 pdb를 사용할 수 있습니다.
포착되지 않은 예외에서 pdb가 자동으로 실행되도록 설정할 수도 있습니다 .
Pydb 는 Pdb의 향상된 버전으로 작성되었습니다. 혜택?
myserver.com/pdb
단순히 수행하는 디버그 모드에서 보기를 추가하십시오 import pdb; pdb.set_trace()
. 대화식 디버거가있는 Flask / Werkzeug를 사용하는 경우, 그냥 수행하는보기를 가질 수도 있습니다 assert False
.
전체 화면 콘솔 기반 Python 디버거 인 http://pypi.python.org/pypi/pudb
이 제품의 목표는 최신 GUI 기반 디버거의 모든 장점을보다 가볍고 키보드 친화적 인 패키지로 제공하는 것입니다. PuDB를 사용하면 터미널에서 코드를 작성하고 테스트 할 때 바로 코드를 디버깅 할 수 있습니다. 뛰어난 (현재는 고대의) DOS 기반 Turbo Pascal 또는 C 도구로 작업 한 경우 PuDB의 UI가 익숙해 보일 수 있습니다.
독립형 스크립트 디버깅에 좋습니다.
python -m pudb.run my-script.py
pip install pudb
pdb를 사용하는 경우 바로 가기의 별명을 정의 할 수 있습니다. 나는 이것을 사용한다 :
# Ned's .pdbrc
# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))
# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.
# Print the instance variables of self.
alias ps pi self
# Print the locals.
alias pl p_ locals() local:
# Next and list, and step and list.
alias nl n;;l
alias sl s;;l
# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d
벌채 반출
파이썬에는 이미 훌륭한 내장 로깅 모듈이 있습니다. 여기서 로깅 템플릿 을 사용할 수 있습니다 .
로깅 모듈을 사용하면 중요도 수준을 지정할 수 있습니다. 디버깅 중에는 모든 것을 기록 할 수 있지만 정상 작동 중에는 중요한 것만 기록 할 수 있습니다. 사물을 켜고 끌 수 있습니다.
대부분의 사람들은 기본 인쇄 문을 사용하여 디버그 한 다음 인쇄 문을 제거합니다. 그대로 두는 것이 좋지만 비활성화하십시오. 그런 다음 다른 버그가 있으면 모든 것을 다시 활성화하고 로그를 살펴볼 수 있습니다.
이는 네트워크 연결의 다른 쪽 끝이 시간 초과되어 사라지기 전에 응답해야하는 네트워킹 프로그램과 같이 빠르게 수행해야하는 프로그램을 디버깅하는 가장 좋은 방법입니다. 디버거를 한 단계 씩 수행 할 시간이 충분하지 않을 수 있습니다. 그러나 코드를 실행하고 모든 것을 로그 한 다음 로그를 숨기고 실제로 무슨 일이 일어나고 있는지 알아낼 수 있습니다.
편집 : 템플릿의 원래 URL은 다음과 같습니다. http://aymanh.com/python-debugging-techniques
이 페이지가 없어서 archive.org에 저장된 스냅 샷에 대한 참조로 교체했습니다. http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques
다시 사라지면 여기에 언급 한 템플릿이 있습니다. 이것은 블로그에서 가져온 코드입니다. 나는 그것을 쓰지 않았다.
import logging
import optparse
LOGGING_LEVELS = {'critical': logging.CRITICAL,
'error': logging.ERROR,
'warning': logging.WARNING,
'info': logging.INFO,
'debug': logging.DEBUG}
def main():
parser = optparse.OptionParser()
parser.add_option('-l', '--logging-level', help='Logging level')
parser.add_option('-f', '--logging-file', help='Logging file name')
(options, args) = parser.parse_args()
logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
logging.basicConfig(level=logging_level, filename=options.logging_file,
format='%(asctime)s %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
# Your program goes here.
# You can access command-line arguments using the args variable.
if __name__ == '__main__':
main()
그리고 위의 사용법에 대한 그의 설명이 있습니다. 다시, 나는 이것에 대한 크레딧을 얻지 못합니다.
기본적으로 로깅 모듈은 위험, 오류 및 경고 메시지를 인쇄합니다. 모든 레벨이 인쇄되도록이를 변경하려면 다음을 사용하십시오.
$ ./your-program.py --logging=debug
debug.log라는 파일로 로그 메시지를 보내려면 다음을 사용하십시오.
$ ./your-program.py --logging-level=debug --logging-file=debug.log
파이썬 라인이 실행되는 것을 인쇄 할 수 있습니다 (Geo! 덕분에). 예를 들어 특정 함수가 호출되는시기를 확인하거나 ##과 같은 것을 추가하여 특정 행만 추적하도록 수정하는 등의 응용 프로그램에는 여러 가지가 있습니다.
code.interact는 대화식 콘솔로 이동합니다
import code; code.interact(local=locals())
콘솔 히스토리에 쉽게 액세스하려면 " 쉘과 같은 히스토리 메커니즘을 사용할 수 있습니까? "를 참조하십시오.
인터프리터에 대해 자동 완성 기능을 사용할 수 있습니다 .
print
진술
debug_print
은 쉽게 비활성화하기 위해 인쇄 대신 기능을 권장합니다pprint
모듈은 복잡한 구조에 매우 중요합니다파이 데브
PyDev 에는 꽤 좋은 대화식 디버거가 있습니다. 시계 식, 호버 투 평가, 스레드 및 스택 목록 및 현대적인 시각적 디버거에서 기대할 수있는 거의 모든 편의 시설이 있습니다. 실행중인 프로세스에 연결하고 원격 디버깅을 수행 할 수도 있습니다.
그러나 다른 시각적 디버거와 마찬가지로 다른 문제를 모두 시도한 후 간단한 문제 또는 매우 복잡한 문제에 유용합니다. 나는 여전히 로깅을 사용하여 대부분의 무거운 작업을 수행합니다.
Visual Studio에 익숙하다면 Visual Studio 용 Python 도구 가 가장 좋습니다.
Winpdb 는 매우 훌륭하며 이름과 달리 완전히 크로스 플랫폼입니다.
매우 멋진 프롬프트 기반 및 GUI 디버거가 있으며 원격 디버깅을 지원합니다.
Vim에는 다음 세 가지 바인딩이 있습니다.
map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>
rpdb2
Remote Python Debugger는 견고한 그래픽 디버거 인 WinPDB와 함께 사용할 수 있습니다. 나는 당신이 요청할 것이라는 것을 알고 있기 때문에 그래픽 디버거가 기대하는 모든 것을 할 수 있습니다 :)
내가 사용 pdb
에서 nose.tools
내가 단위 테스트뿐만 아니라 일반 코드를 디버깅 할 수 있도록.
마지막으로 F7
매핑은 예외가 스택의 상단으로 버블 링 될 때 얻을 수있는 것과 유사한 트레이스 백을 인쇄합니다. 나는 그것이 몇 번 이상 실제로 유용하다는 것을 알았습니다.
Andreas Zeller의 Udacity에있는 " Software Debugging " 이라는 전체 온라인 과정이 있으며 디버깅 에 대한 팁을 제공합니다.
코스 요약
이 클래스에서는 프로그램을 체계적으로 디버깅하는 방법, 디버깅 프로세스를 자동화하는 방법 및 Python에서 여러 자동화 된 디버깅 도구를 작성하는 방법을 학습합니다.
왜이 과정을 수강합니까?
이 과정을 마치면 체계적인 디버깅에 대해 제대로 이해하고 디버깅을 자동화하는 방법을 알고 Python에서 여러 기능 디버깅 도구를 구축하게됩니다.
전제 조건 및 요구 사항
Udacity CS101 이상의 수준에서 프로그래밍 및 Python에 대한 기본 지식이 필요합니다. 객체 지향 프로그래밍에 대한 기본적인 이해가 도움이됩니다.
추천.
호출 스택을 읽기 쉬운 방식으로 인쇄하는 멋진 그래픽 방법을 원한다면 다음 유틸리티를 확인하십시오. https://github.com/joerick/pyinstrument
명령 행에서 실행하십시오.
python -m pyinstrument myscript.py [args...]
모듈로 실행하십시오.
from pyinstrument import Profiler
profiler = Profiler()
profiler.start()
# code you want to profile
profiler.stop()
print(profiler.output_text(unicode=True, color=True))
장고와 함께 실행 :
그냥 추가 pyinstrument.middleware.ProfilerMiddleware
하는 MIDDLEWARE_CLASSES
후 추가 ?profile
프로파일을 활성화 요청 URL의 끝에.