Python 디버깅 팁
파이썬 디버깅을 위한 최고의 팁은 무엇입니까?
특정 디버거가 실제로 무엇을 할 수 있는지 말하지 않고 나열만 하지 마십시오.
관련된
- 파이썬 코드를 처음 실행하는 좋은 방법은 무엇입니까? - 오류 최소화에 대해 설명합니다.
모듈을 하여 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를 사용하여 임의의 Python 식을 실행할 수 있습니다.예를 들어, 오류를 발견한 경우 코드를 수정한 다음 실행 중인 코드에서 동일한 효과를 낼 형식 식을 입력할 수 있습니다.
ipdb는 IPython용 pdb 버전입니다.탭 완료를 포함한 모든 IPython 기능과 함께 pdb를 사용할 수 있습니다.
탐지되지 않은 예외에 대해 pdb가 자동으로 실행되도록 설정할 수도 있습니다.
Pydb는 Pdb의 향상된 버전으로 작성되었습니다.혜택?
http://pypi.python.org/pypi/pudb, 은 전체 화면의 콘솔 기반 Python 디버거입니다.
그것의 목표는 더 가볍고 키보드 친화적인 패키지로 현대 GUI 기반 디버거의 모든 세부 사항을 제공하는 것입니다.PuDB를 사용하면 터미널에서 코드를 작성하고 테스트하는 바로 디버깅할 수 있습니다.만약 당신이 뛰어난 (그러나 지금은 오래된) DOS 기반의 Turbo Pascal 또는 C 도구로 작업했다면, PuDB의 UI는 친숙해 보일 수 있습니다.
독립 실행형 스크립트를 디버깅하는 데 적합합니다. 그냥 실행하십시오.
python -m pudb.run my-script.py
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
로깅
Python에는 이미 훌륭한 내장 로깅 모듈이 있습니다.여기서 로깅 템플릿을 사용할 수 있습니다.
로깅 모듈을 사용하면 중요도 수준을 지정할 수 있습니다. 디버깅 중에는 모든 항목을 기록할 수 있지만 일반 작업 중에는 중요한 항목만 기록할 수 있습니다.전원을 껐다가 켤 수 있습니다.
대부분의 사용자는 기본 인쇄 명령문을 사용하여 디버깅한 다음 인쇄 명령문을 제거합니다.사용하지 않도록 설정한 후 다른 버그가 발생하면 모든 항목을 다시 활성화하고 로그를 확인하는 것이 좋습니다.
이 방법은 네트워크 연결의 다른 쪽 끝이 시간 초과되어 사라지기 전에 응답해야 하는 네트워킹 프로그램과 같이 신속하게 작업을 수행해야 하는 프로그램을 디버깅하는 가장 좋은 방법일 수 있습니다.디버거를 한 단계씩 실행할 시간이 많지 않을 수도 있지만, 코드를 실행하고 모든 것을 기록한 다음, 로그를 자세히 살펴보고 실제로 무슨 일이 일어나고 있는지 파악할 수 있습니다.
편집: 템플릿의 원래 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.dll을 사용하면 대화형 콘솔로 이동할 수 있습니다.
import code; code.interact(local=locals())
콘솔 기록에 쉽게 액세스하려면 "셸과 같은 기록 메커니즘을 사용할 수 있습니까?"를 확인하십시오.
인터프리터에 대해 자동 완성을 사용할 수 있습니다.
ipdb는 ipython의 멋진 점을 가진 pdb와 같습니다.
print
- 은 어떤사은추천다니합들람▁a다를 추천합니다.
debug_print
인쇄 대신 기능을 할 수 . 비 활 성 인 대 신 기 능 - 그
pprint
은 복잡한 합니다.
스크립트를 디버깅하는 명백한 방법
python -m pdb script.py
- 스크립트가 예외를 발생시킬 때 유용합니다.
- virtualenv를 사용하고 pdb 명령이 venvs python 버전으로 실행되지 않을 때 유용합니다.
만약 당신이 그 스크립트가 정확히 어디에 있는지 모른다면.
python -m pdb ``which <python-script-name>``
파이데브
PyDev는 꽤 좋은 대화형 디버거를 가지고 있습니다.시계 표현식, 평가할 마우스 커서, 스레드 및 스택 목록 및 최신 비주얼 디버거에서 기대하는 모든 일반적인 편의시설이 있습니다.실행 중인 프로세스에 연결하여 원격 디버깅을 수행할 수도 있습니다.
다른 시각적 디버거와 마찬가지로, 저는 다른 모든 것을 시도한 후에 주로 단순한 문제나 매우 복잡한 문제에 유용하다고 생각합니다.저는 여전히 대부분의 무거운 물건을 벌목으로 들어 올립니다.
Visual Studio에 익숙한 사용자라면 Visual Studio용 Python Tools를 찾을 수 있습니다.
Winpdb는 매우 좋고, 이름과는 반대로 완전히 교차 플랫폼입니다.
그것은 매우 좋은 프롬프트 기반과 GUI 디버거를 가지고 있으며, 원격 디버깅을 지원합니다.
빔에는 다음과 같은 세 가지 결합이 있습니다.
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
는 원격 Python Debugger로, 솔리드 그래픽 디버거인 WinPDB와 함께 사용할 수 있습니다. 있기 를 기대하는 모든 을 할 수 :) 신이물당것을그디래버가 할예는다모니있습 :)
사용합니다pdb
nose.tools
유닛 테스트와 일반 코드를 디버깅할 수 있습니다.
막으로마지,로으,F7
매핑은 트레이스백을 인쇄합니다(예외가 스택의 맨 위로 버블링될 때 받는 종류와 유사함).저는 그것이 정말 유용하다는 것을 몇 번 이상 발견했습니다.
클래스에 대해 유용한 repr() 메서드를 정의하고 repr() 또는 "%r" %(...) 또는 "..."를 사용합니다.디버깅 메시지/로그의 {0!r}.format(...)은 IMHO가 효율적인 디버깅을 위한 키입니다.
또한 다른 답변에 언급된 디버거는 repr() 방법을 사용합니다.
실행 중인 Python 응용 프로그램에서 스택 추적 가져오기
여기에는 몇 가지 요령이 있습니다.여기에는 다음이 포함됩니다.
- 인터프리터 침입/신호 전송으로 스택 추적 인쇄
- 준비되지 않은 Python 프로세스에서 스택 추적 가져오기
- 디버깅에 유용하도록 플래그를 사용하여 인터프리터 실행
것을 (▁of▁usability▁ifand▁poor▁inugg▁donate▁you)▁deb경않는우▁appreci▁(ers(경우디버t▁time▁don지'좋)pdb
실행 추적을 덤프하고 나중에 분석할 수 있습니다.예:
python -m trace -t setup.py install > execution.log
의 모든 소스 라인을 덤프합니다.setup.py install
에 대한 집행.execution.log
.
추적 출력을 사용자 정의하고 추적기를 더 쉽게 작성할 수 있도록 몇 가지 코드를 추적 모듈(퍼블릭 도메인)에 통합했습니다.
가능한 경우 다음을 사용하여 디버깅합니다.M-x pdb
소스 수준 디버깅을 위한 emacs.
Udacity에 대한 Andreas Zeller의 "소프트웨어 디버깅"이라는 전체 온라인 과정이 있으며 디버깅에 대한 팁이 포함되어 있습니다.
과정 요약
이 수업에서는 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 끝으로 이동합니다.
언급URL : https://stackoverflow.com/questions/1623039/python-debugging-tips
'programing' 카테고리의 다른 글
인접 열에 따른 자동 채우기 (0) | 2023.06.15 |
---|---|
TypeScript 인터페이스 구현이 메서드 매개 변수를 확인하지 않음 (0) | 2023.06.15 |
임의 키를 사용하여 입력한 개체를 선언하는 방법은 무엇입니까? (0) | 2023.06.15 |
하나의 필드를 CLOB로 사용하여 오라클 삽입 스크립트를 작성하는 방법은 무엇입니까? (0) | 2023.06.15 |
VueX: 모듈로 상태를 중첩하지 않습니까? (0) | 2023.06.15 |