파이썬 디버깅의 진정한 전문가가 되고 싶으신가요? 이제부터 소개할 놀라운 파이썬 디버깅 도구와 라이브러리를 활용하여 파이썬 코드를 효율적으로 디버깅해 보세요!
파이썬은 다양한 목적으로 사용되는 다재다능한 고급 객체 지향 프로그래밍 언어입니다. 웹 애플리케이션 개발부터 웹 스크래핑, 그리고 기계 학습 및 데이터 과학과 같은 복잡한 응용 프로그램까지, 파이썬은 다양한 분야에서 강력한 개발 도구로 활용되고 있습니다.
프로그래밍 과정에서 버그, 즉 오류는 피할 수 없는 존재입니다. 개발자들은 코드 내의 기존 버그와 잠재적 버그를 찾아 제거하기 위해 여러 단계를 거칩니다. 이러한 과정을 통해 프로그램 코드가 손상되는 것을 방지할 수 있습니다. 이 일련의 과정을 ‘디버깅’이라고 합니다.
본 기사에서는 다양한 파이썬 디버거들을 살펴보고, 각 디버거의 차이점과 효과적인 구현 방법을 알아보겠습니다.
cProfiler 디버깅 라이브러리
cProfiler는 널리 사용되는 라이브러리이자, C 확장으로 구현되어 장시간 실행되는 코드의 프로파일링을 수행합니다. 이 도구는 프로그램 코드 중 실행 시간이 오래 걸리는 부분을 식별하는 데 유용하지만, 코드의 버그를 직접 찾아 수정하는 기능은 제공하지 않습니다.
따라서, cProfiler 외에 다른 디버거를 추가적으로 사용해야 할 필요성이 생깁니다.
다행히도, ipdb, Django-debug-toolbar, pyelftools, viztracer, py-spy와 같은 강력한 라이브러리들이 파이썬 코드 디버깅 도구로 사용될 수 있습니다.
ipdb 디버깅 도구
ipdb는 IPython을 완벽하게 지원하는 대화형 타사 디버거로, pdb의 모든 기능을 포함합니다. 또한, ipdb는 대화형 셸인 IPython을 지원하며, 탭 자동 완성, 색상 지원, 매직 기능과 같은 다양한 추가 기능을 제공합니다.
이 디버거를 사용하면 IPython 디버거에 접근하고 관련된 기능을 활용할 수 있습니다. 또한 pdb 모듈과 유사한 인터페이스를 제공하여 편의성을 높였습니다.
ipdb를 사용한 디버깅 방법
ipdb 라이브러리는 pip 명령을 사용하여 설치할 수 있습니다.
pip install ipdb
ipdb 사용 예시는 다음과 같습니다.
import ipdb alpha_list = ['a', 'b', 'c'] fruit_list = ['orange', 'mango', 'kiwi'] def nested_loop(): for fruit in fruit_list: print (fruit) ipdb.set_trace() for x in alpha_list: print(x) if __name__ == '__main__': nested_loop()
test.py 파일이 있는 경우 다음 명령을 사용하여 파이썬 파일을 실행합니다.
python -m ipdb test.py
ipdb를 import하고 `ipdb.set_trace()` 함수를 실행하면 프로그램이 시작되고 실행 중 디버거가 활성화됩니다.
ipdb.pm() 함수 (post-mortem)는 %debug 매직 함수와 유사하게 작동합니다.
set_trace 인자
`set_trace`에 인수로 컨텍스트를 전달하여 정의된 여러 줄의 코드를 표시할 수 있습니다. 또한 `set_trace`는 부울 값을 허용하는 `cond` 인수를 가질 수 있으며, `cond`가 참으로 설정되면 ipdb 인터페이스가 시작됩니다.
구성 파일 사용
홈 폴더와 프로젝트 폴더에서 각각 사용 가능한 idpdb 파일 또는 setup.cfg 파일로 컨텍스트 인수를 설정할 수 있습니다. 이를 통해 ipdb의 기능을 더욱 다양하게 활용할 수 있습니다.
Django 디버그 툴바
Django 디버그 툴바는 파이썬 프레임워크인 Django에서 널리 사용되는 디버깅 도구입니다.
이 툴바는 현재 요청 또는 응답에 대한 다양한 디버그 정보를 표시하는 패널 세트로 구성되어 있습니다. 툴바를 클릭하면 각 패널 내용에 대한 자세한 정보를 확인할 수 있습니다.
이 도구는 Django 개발 환경을 철저히 검사하는 데 유용합니다.
설치 및 구성 방법은 여기에서 확인할 수 있습니다.
Pyelftools 라이브러리
pyelftools 라이브러리는 순수 파이썬으로 만들어졌으며, ELF 파일과 DWARF 디버깅 정보를 파싱하고 분석할 수 있습니다. 외부 라이브러리에 의존하지 않으므로 파이썬만 실행하면 됩니다.
pyelftools를 사용하는 것은 외부 라이브러리가 필요 없으므로 매우 간단합니다. 또한 환경 변수에서 `PYTHONPATH`를 조정하기만 하면 되므로 설치 없이도 쉽게 pyelftools를 사용할 수 있습니다.
다음 명령으로 설치할 수 있습니다.
pip install pyelftools
pyelftools를 사용하려면 간단히 import하여 프로그램에서 호출하면 됩니다.
아이스크림(🍦) 디버깅 도구
아이스크림은 파이썬 개발자를 위한 또 다른 효율적인 디버깅 도구입니다.
아이스크림의 `ic()` 함수는 `print()`보다 다음과 같은 여러 가지 이점을 제공합니다.
- 입력하기가 상대적으로 빠릅니다.
- 데이터 구조를 효과적으로 출력합니다.
- `ic()`를 사용하여 표현식 또는 변수 이름과 해당 값을 출력합니다.
- 출력 구문을 강조 표시합니다.
- 파일 이름, 줄 번호 및 상위 함수를 포함한 프로그램 컨텍스트를 선택적으로 포함합니다.
이 패키지를 사용하기 전에 다음 pip 명령을 사용하여 설치해야 합니다.
pip install icecream
좋은 점은 `install()` 함수를 사용하여 설치하면 모든 파일에서 반드시 `ic()`를 import할 필요 없이 사용할 수 있다는 것입니다. 또한 `install()`은 내장 모듈에 `ic()`를 추가하므로 인터프리터가 가져오는 모든 파일에서 `ic()`를 공유할 수 있습니다.
x.py라는 이름의 첫 번째 루트 파이썬 파일에서 `install()`을 사용하여 `ic()`를 추가합니다.
from icecream import install install() from y import mult mult()
y.py 파일에서 x.py 파일을 import하여 `ic()`를 사용하려면 다음과 같이 합니다.
def mult(): z=8 ic(z)
결과:
y ic| z : 8
`ic()` 함수가 더욱 효과적인 이유는, 자신을 포함하여 전달된 변수를 검사한 다음 다음 예제와 같이 해당 인자와 인자 값을 출력하는 기능 때문입니다.
from icecream import ic def mult(x): return x * 4 ic(mult(100))
출력:
ic| mult(100): 400
또한 `ic()`는 인수를 반환하므로 기존 코드에 쉽게 삽입할 수 있습니다. 다음 예제는 `ic| x: 12`, `ic| y: 48`을 출력합니다.
from icecream import ic x = 12 def mult(x): return x*4 y = mult(ic(x)) ic(y)
py-spy 도구를 사용한 디버깅
py-spy는 파이썬 프로그램의 샘플 프로파일링을 위한 디버깅 도구입니다. 프로그램을 다시 시작하거나 코드를 수정하지 않고도 py-spy를 사용하여 파이썬 프로그램의 실행을 시각화할 수 있습니다. Rust로 작성되어 있어 오버헤드가 적다는 장점도 있습니다.
프로덕션 환경에서 실행 중인 파이썬 코드에 py-spy를 사용하는 것은 안전합니다. 프로파일링 대상 프로그램과는 다른 프로세스를 실행하기 때문입니다.
다른 도구들과 마찬가지로, py-spy 도구를 설치한 후 사용할 수 있습니다.
pip install py-spy
py-spy는 프로덕션 트래픽을 처리하는 파이썬 프로그램에도 사용할 수 있으므로, 중요한 파이썬 프로파일러 도구라고 할 수 있습니다.
Viztracer 디버거
Viztracer는 파이썬 프로그램 실행을 추적하고 시각화할 수 있는 디버깅 도구입니다. 낮은 오버헤드로 로깅이 가능한 프로파일링 도구이기도 합니다.
Viztracer를 효과적인 디버깅 도구로 만드는 요인은 다음과 같습니다.
- 사용하기가 매우 쉽고 외부 패키지에 의존하지 않습니다.
- Windows, Linux, macOS 등 모든 운영체제에서 작동합니다.
- GB 수준의 추적 데이터를 부드럽게 렌더링하는 강력한 프런트엔드를 제공합니다.
- RegEx를 사용하여 임의의 함수를 기록하고, 변수 및 속성, 발생한 예외, 가비지 컬렉터 작업 등 추가 정보를 소스 코드 수정 없이 기록할 수 있습니다.
- Viztracer는 프로그램에서 필요 없는 데이터를 필터링하는 기능으로 인해 오버헤드가 낮은 디버깅 도구로 작동합니다. JSON 형식으로 로그를 덤프하기 전에 이전 정보를 보관합니다.
- 즉석 이벤트, 가변 이벤트, 기간 이벤트와 같은 사용자 정의 이벤트를 프로그램 실행 중에 삽입할 수 있습니다. 이는 데이터를 추적할 때 인쇄가 발생하는 시점을 알려주는 인쇄 디버깅과 유사하게 작동합니다.
결론
소프트웨어 프로파일링과 마찬가지로 파이썬 프로파일링 및 디버깅은 개발 과정에서 중요한 단계입니다. 이 단계를 통해 코드의 전체 성능을 최적화하고, 버그가 있는 코드 섹션을 제거할 수 있습니다.
위에서 소개한 디버깅 도구들은 파이썬 개발자의 작업을 훨씬 쉽게 만들어 주는 효율적인 도구입니다.
cProfiler보다 효과적인 디버깅 도구를 사용하면 진정한 개발자 영웅처럼 파이썬 코드를 디버깅하고 잠재적인 버그를 수정하여 코드가 문제 없이 실행되도록 할 수 있습니다.
즐거운 디버깅 되세요!