Python 코드를 디버깅하는 여러 가지 방법
인쇄 문 사용: Python 코드를 디버깅하는 가장 간단한 방법 중 하나는 코드에 인쇄 문을 추가하는 것입니다. 이렇게 하면 코드가 실패한 위치와 프로그램의 각 단계에서 변수 값이 무엇인지 식별하는 데 도움이 됩니다.
Python의 print 문을 사용하여 간단한 프로그램을 디버깅하는 방법의 예입니다.
example.py라는 파일에 다음 코드가 있다고 가정합니다.
def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result
num = 5
fact = factorial(num)
print(f"The factorial of {num} is {fact}")
이 코드는 for 루프를 사용하여 숫자의 계승을 계산합니다. 이 경우 계승 함수에 num을 5로 전달합니다.
print 문을 사용하여 이 코드를 디버깅하기 위해 프로그램의 다양한 단계에서 변수 값을 출력하는 문을 추가할 수 있습니다. 다음은 업데이트된 example.py 파일입니다.
def factorial(n):
result = 1
for i in range(1, n+1):
print(f"i: {i}, result: {result}")
result *= i
return result
num = 5
fact = factorial(num)
print(f"The factorial of {num} is {fact}")
이 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
i: 1, result: 1
i: 2, result: 1
i: 3, result: 2
i: 4, result: 6
i: 5, result: 24
The factorial of 5 is 120
print 문을 추가하면 루프의 각 단계에서 i 값과 결과를 볼 수 있습니다. 이렇게 하면 코드의 문제를 식별하고 예상대로 작동하는지 확인할 수 있습니다. 이 경우 프로그램이 5의 계승을 올바르게 계산하여 최종 결과가 120임을 알 수 있습니다.
IDE(통합 개발 환경) 사용: PyCharm, Visual Studio Code 및 Spyder와 같은 IDE에는 중단점을 설정하고, 변수를 검사하고, 코드를 단계별로 실행할 수 있는 디버깅 도구가 내장되어 있습니다.
Python 통합 개발 환경(IDE)을 사용하여 간단한 프로그램을 디버깅하는 방법의 예입니다.
example.py라는 파일에 다음 코드가 있다고 가정합니다.
def multiply(x, y):
result = x * y
return result
num1 = 10
num2 = 5
result = multiply(num1, num2)
print(result)
이 코드는 두 개의 인수를 받아 곱하고 결과를 반환하는 곱하기 함수를 정의합니다. 이 경우 곱하기 위해 num1과 num2를 전달하고 num2는 5로 설정합니다.
IDE를 사용하여 이 코드를 디버깅하려면 내장된 디버거를 사용할 수 있습니다. 다음은 PyCharm IDE를 사용하는 예입니다.
PyCharm에서 example.py 파일을 엽니다.
결과 = 곱하기(num1, num2) 행 옆의 행 번호를 클릭하여 중단점을 설정하십시오. 그러면 해당 줄에서 프로그램 실행이 일시 중지됩니다.
디버깅을 시작하려면 도구 모음에서 "디버그" 버튼을 클릭하십시오.
PyCharm은 창 하단에 "디버그" 패널을 엽니다. 이 패널은 프로그램의 현재 상태를 표시하고 코드를 단계별로 실행할 수 있도록 합니다.
"Step Over" 버튼(또는 F8 키)을 클릭하여 현재 라인을 실행하고 다음 라인으로 이동합니다.
5단계를 반복하여 프로그램을 한 번에 한 줄씩 진행합니다.
프로그램이 중단점에 도달하면 실행을 일시 중지하고 변수의 현재 값을 표시합니다.
"디버그" 패널을 사용하여 변수를 검사하고 필요에 따라 프로그램을 단계별로 실행합니다.
디버깅이 완료되면 도구 모음에서 "중지" 버튼을 클릭하여 디버깅 모드를 종료합니다.
IDE의 기본 제공 디버거를 사용하여 코드를 쉽게 단계별로 실행하고 문제를 식별할 수 있습니다. 이 경우 프로그램이 num1과 num2의 곱을 올바르게 계산하여 최종 결과가 50임을 알 수 있습니다.
예외 처리 사용: Python에는 오류를 포착하고 정상적으로 처리할 수 있는 강력한 예외 처리 시스템이 있습니다. try-except 블록을 사용하여 코드의 오류를 포착하고 처리할 수 있습니다.
Python 예외 처리를 사용하여 간단한 프로그램을 디버깅하는 방법의 예입니다.
example.py라는 파일에 다음 코드가 있다고 가정합니다.
def divide(x, y):
result = x / y
return result
num1 = 10
num2 = 0
result = divide(num1, num2)
print(result)
이 코드는 두 개의 인수를 받아서 나누고 결과를 반환하는 나누기 함수를 정의합니다. 이 경우 num2를 0으로 설정하여 나누기 위해 num1과 num2를 전달합니다.
이 프로그램을 실행하면 0으로 나눌 수 없기 때문에 ZeroDivisionError가 발생합니다. 예외 처리를 사용하여 이 코드를 디버깅하기 위해 ZeroDivisionError를 포착하고 적절하게 처리할 수 있습니다. 다음은 example.py의 업데이트된 버전입니다.
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("Error: division by zero")
result = None
return result
num1 = 10
num2 = 0
result = divide(num1, num2)
if result is not None:
print(result)
이 버전의 코드에서는 나누기 작업을 try 블록으로 래핑하고 ZeroDivisionError를 포착했습니다. 이 오류가 발생하면 오류 메시지를 인쇄하고 결과를 없음으로 설정합니다. 그렇지 않으면 나누기 결과를 반환합니다.
이 업데이트된 코드를 실행하면 "Error: division by zero"라는 오류 메시지가 콘솔에 출력되어 ZeroDivisionError가 발생했음을 나타냅니다. 최종 인쇄 문은 결과를 인쇄하기 전에 결과가 None이 아닌지 확인하는 if 문으로 래핑됩니다. 이 경우 결과가 None이므로 인쇄되지 않습니다.
예외 처리를 사용하면 코드의 오류를 정상적으로 처리하고 프로그램이 충돌하지 않도록 할 수 있습니다. 이 경우 ZeroDivisionError를 포착하고 오류 메시지를 인쇄하여 프로그램을 계속 실행할 수 있습니다.
로깅 사용: Python의 로깅 모듈을 사용하면 로그 파일이나 콘솔에 메시지를 쓸 수 있습니다. 프로그램에 대한 중요한 정보를 기록하면 코드가 실패한 위치를 쉽게 식별할 수 있습니다.
Python 로깅을 사용하여 간단한 프로그램을 디버깅하는 방법의 예입니다.
example.py라는 파일에 다음 코드가 있다고 가정합니다.
import math
def calculate_square_root(x):
result = math.sqrt(x)
return result
num = -1
result = calculate_square_root(num)
print(result)
이 코드는 하나의 인수를 사용하고 math.sqrt 함수를 사용하여 제곱근을 계산하고 결과를 반환하는 함수calculate_square_root를 정의합니다. 이 경우 num을 -1로 설정하여 num을 calculate_square_root에 전달합니다.
이 프로그램을 실행하면 음수의 제곱근을 계산할 수 없기 때문에 ValueError가 발생합니다. 로깅을 사용하여 이 코드를 디버깅하려면 진행 상황을 이해하는 데 도움이 되는 로깅 문을 코드에 추가할 수 있습니다. 다음은 example.py의 업데이트된 버전입니다.
import math
import logging
logging.basicConfig(level=logging.DEBUG)
def calculate_square_root(x):
if x < 0:
logging.error("Cannot calculate square root of negative number")
return None
result = math.sqrt(x)
return result
num = -1
result = calculate_square_root(num)
if result is not None:
print(result)
이 버전의 코드에서는 Python의 로깅 모듈을 사용하여 로깅 문을 추가했습니다. basicConfig 메서드는 로깅 수준을 DEBUG로 설정합니다. 즉, DEBUG, INFO, WARNING, ERROR 및 CRITICAL 수준의 모든 메시지가 기록됩니다.
또한 출력하기 전에 결과가 None이 아닌지 확인하는 if 문을 추가하여 제곱근이 성공적으로 계산된 경우에만 결과를 출력하도록 했습니다.
이 업데이트된 코드를 실행하면 "음수의 제곱근을 계산할 수 없습니다"라는 오류 메시지가 콘솔에 출력되어 ValueError를 포착하고 오류 메시지를 기록했음을 나타냅니다. 이 경우 결과가 None이므로 인쇄되지 않습니다.
로깅을 사용하면 디버깅에 도움이 되는 유용한 정보를 코드에 추가할 수 있습니다. 이 경우 프로그램이 잘못된 입력을 발견했을 때 오류 메시지를 인쇄하는 로깅 문을 추가하여 문제를 식별하고 수정할 수 있습니다.
일반적으로 효과적인 디버깅의 핵심은 오류를 식별하고 수정하는 데 체계적인 접근 방식을 취하는 것입니다. 코드가 실패한 위치를 식별하는 것부터 시작한 다음 적절한 도구를 사용하여 문제를 격리하고 수정하십시오.
디버거 사용: Python에는 "pdb"라는 내장 디버거 모듈이 있습니다. 이 모듈을 사용하면 코드를 한 줄씩 단계별로 실행하고, 변수를 검사하고, 중단점을 설정하여 특정 지점에서 프로그램 실행을 중지할 수 있습니다.
다음은 pdb 모듈을 사용하여 간단한 Python 프로그램을 디버깅하는 방법의 예입니다.
example.py라는 파일에 다음 코드가 있다고 가정합니다.
def divide(x, y):
result = x / y
return result
num1 = 10
num2 = 0
result = divide(num1, num2)
print(result)
나누기 함수는 두 개의 인수를 받아서 나누고 결과를 반환합니다. 이 경우, 나누기 위해 num1과 num2를 전달하고 num2는 0으로 설정하여 ZeroDivisionError를 발생시킵니다.
pdb를 사용하여 이 코드를 디버깅하려면 스크립트 시작 부분에 다음 행을 추가할 수 있습니다.
import pdb; pdb.set_trace()
이렇게 하면 지정된 코드 줄에서 Python 디버거가 시작됩니다. 다음은 업데이트된 example.py 파일입니다.
import pdb; pdb.set_trace()
def divide(x, y):
result = x / y
return result
num1 = 10
num2 = 0
result = divide(num1, num2)
print(result)
이 프로그램을 실행하면 pdb.set_trace() 라인에서 실행이 일시 중지되고 디버깅을 시작할 수 있습니다. 다음은 사용할 수 있는 몇 가지 유용한 pdb 명령입니다.
n: 다음 코드 줄 실행
s: 함수 호출 단계로 들어가기
c: 다음 중단점까지 계속 실행
p: 변수 값 출력
q: 디버깅 종료
이러한 명령을 사용하여 코드를 단계별로 실행하고 오류를 식별할 수 있습니다. 이 경우 오류가 result = x / y 줄에서 발생하는 것을 볼 수 있습니다. 여기서 y는 0입니다. 그런 다음 코드를 수정하여 이 오류를 정상적으로 처리할 수 있습니다(예: try-except 블록 추가).
오류 처리가 포함된 업데이트된 example.py 파일은 다음과 같습니다.
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("Error: division by zero")
return None
return result
num1 = 10
num2 = 0
result = divide(num1, num2)
if result is not None:
print(result)
이제 이 프로그램을 실행하면 역추적 대신 "오류: 0으로 나누기"라는 오류 메시지가 표시되고 프로그램이 계속 실행됩니다.
'파이썬' 카테고리의 다른 글
[Python]#14 예외 처리 & 오류 (0) | 2023.03.02 |
---|---|
[Python]#13 파이썬 class 사용법 (0) | 2023.03.01 |
[Python]#11 파이썬 tuple & error 유형 (0) | 2023.02.26 |
[python]#10 Python dictionary & error 유형 (0) | 2023.02.25 |
[python]#9 파이썬 함수, 에러 유형 (0) | 2023.02.24 |