>백엔드 개발 >파이썬 튜토리얼 >Python 스크립트 디버깅 및 분석(코드 예제)

Python 스크립트 디버깅 및 분석(코드 예제)

不言
不言앞으로
2019-04-11 13:08:353948검색

이 기사의 내용은 Python 스크립트(코드 예제)의 디버깅 및 분석에 관한 것입니다. 필요한 친구가 참고할 수 있기를 바랍니다.

디버깅과 프로파일링은 Python 개발에서 중요한 역할을 합니다. 디버거는 프로그래머가 전체 코드를 분석하는 데 도움이 됩니다. 디버거는 중단점을 설정하고, 프로파일러는 코드를 실행하고 실행 시간 세부 정보를 제공하며, 프로파일러는 프로그램의 병목 현상을 식별합니다.

Python 디버깅 기술

디버깅은 코드에서 발생하는 문제를 해결하고 소프트웨어가 제대로 작동하지 못하게 하는 프로세스입니다. Python에서는 디버깅이 매우 쉽습니다. Python 디버거는 조건부 중단점을 설정하고 소스 코드를 한 번에 한 줄씩 디버그합니다. Python 표준 라이브러리의 pdb 모듈을 사용하여 Python 스크립트를 디버깅합니다.

Python 프로그램을 더 효과적으로 디버깅하기 위해 다양한 기술을 사용할 수 있습니다. 우리는 Python 디버깅을 위한 네 가지 기술을 논의할 것입니다:

  • print() 진술: 이것은 무슨 일이 일어나고 있는지 이해하는 가장 쉬운 방법이므로 무엇이 실행되었는지 검사할 수 있습니다.
  • logging: 이는 인쇄 문과 비슷하지만 더 많은 상황별 정보가 포함되어 있어 완전히 이해할 수 있습니다.
  • pdb 디버거: 이는 일반적으로 사용되는 디버깅 기술입니다. pdb 사용의 장점은 명령줄, 인터프리터 및 프로그램에서 pdb를 사용할 수 있다는 것입니다.
  • IDE 디버거: IDE에는 통합 디버거가 있습니다. 이를 통해 개발자는 코드를 실행할 수 있으며, 코드가 실행되는 동안 프로그램을 검사할 수 있습니다.

오류 처리(예외 처리)

이 섹션에서는 Python이 예외를 처리하는 방법을 알아봅니다. 예외는 프로그램 실행 중에 발생하는 오류입니다. 오류가 발생할 때마다 Python은 예외를 생성하며, 이는 try...out 블록을 사용하여 처리됩니다. 프로그램이 특정 예외를 처리할 수 없어 오류 메시지가 발생합니다. 이제 우리는 몇 가지 특이한 예를 볼 것입니다.

터미널에서 python3 대화형 콘솔을 시작하면 몇 가지 예외 예가 표시됩니다.

student@ubuntu:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> 50 / 0

Traceback (most recent call last):
 File "", line 1, in ZeropisionError: pision by zero
>>>
>>> 6 + abc*5
Traceback (most recent call last):
  File "", line 1, in NameError: name 'abc' is not defined
>>>
>>> 'abc' + 2
Traceback (most recent call last):
  File "", line 1, in TypeError: Can't convert 'int' object to str implicitly
>>>
>>> import abcd
Traceback (most recent call last):
  File "", line 1, in ImportError: No module named 'abcd'
>>>

다음은 몇 가지 예외 예입니다. 이제 예외를 어떻게 처리하는지 살펴보겠습니다.

Python 프로그램에서 오류가 발생할 때마다 예외가 발생합니다. 또한 raise 키워드를 사용하여 예외를 강제로 발생시킬 수도 있습니다.

이제 예외를 처리하는 try...out 블록을 볼 수 있습니다. try 블록에서는 예외를 생성할 수 있는 코드를 작성합니다. Except 블록에는 예외에 대한 솔루션을 작성합니다.

try...Exception 구문은 다음과 같습니다.

try:
            statement(s)
except:
            statement(s)

try 블록에는 여러 개의 Except 문이 있을 수 있습니다. Except 키워드 뒤에 예외 이름을 입력하여 특정 예외를 처리할 수도 있습니다. 특정 예외를 처리하는 구문은 다음과 같습니다:

try:
            statement(s)
except exception_name:
            statement(s)

ZeropisionError를 잡기 위해 예외_example.py 스크립트를 생성합니다. 스크립트에 다음 코드를 작성하세요:

a = 35
b = 57
try:
            c = a + b
            print("The value of c is: ", c)
            d = b / 0
            print("The value of d is: ", d)
 
except:
            print("pision by zero is not possible")
 
print("Out of try...except block")

아래와 같이 스크립트를 실행하면 다음과 같은 출력이 표시됩니다.

student@ubuntu:~$ python3 exception_example.py
The value of c is:  92
pision by zero is not possible
Out of try...except block

Debugger 도구 # 🎜🎜#

Python은 다양한 디버깅 도구를 지원합니다:

    winpdb
  • pydev
  • pydb# 🎜 🎜#
  • pdb
  • gdb
  • pyDebug
  • 이 섹션에서는 pdb Python 디버거에 대해 알아봅니다. . pdbmodule은 Python 표준 라이브러리의 일부이며 항상 사용할 수 있습니다.

pdb 디버거
pdb 모듈은 Python 프로그램을 디버깅하는 데 사용됩니다. Python 프로그램은 pdb 대화형 소스 코드 디버거를 사용하여 프로그램을 디버그합니다. pdb는 중단점을 설정하고 스택 프레임을 검사하며 소스 코드를 나열합니다.

이제 pdb 디버거 사용법을 배워보겠습니다. 이 디버거를 사용하는 방법에는 세 가지가 있습니다:

· 인터프리터에서

· 명령줄에서

· Python 스크립트에서 #🎜🎜 #

pdb_example.py 스크립트를 생성하고 스크립트에 다음 내용을 추가합니다:

class Student:
            def __init__(self, std):
                        self.count = std
 
            def print_std(self):
                        for i in range(self.count):
                                    print(i)
                        return
if __name__ == '__main__':
            Student(5).print_std()
이 스크립트를 Python 디버깅을 배우기 위한 예로 사용하여 디버거를 시작하는 방법을 살펴보겠습니다. 상세히.

인터프리터에서

Python 대화형 콘솔에서 디버거를 시작하려면 run() 또는 runeval()을 사용합니다.

python3 대화형 콘솔을 시작합니다. 다음 명령을 실행하여 콘솔을 시작하십시오.

$ python3
pdb_example 스크립트 이름과 pdb 모듈을 가져옵니다. 이제 run()을 사용하고 문자열 표현식을 run()에 인수로 전달합니다. Python 인터프리터 자체:

student@ubuntu:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pdb_example
>>> import pdb
>>> pdb.run('pdb_example.Student(5).print_std()')
> (1)()
(Pdb)
디버깅을 계속하려면 (Pdb) 프롬프트 다음에 continue를 입력하고 Enter를 누르세요. 여기에서 사용할 수 있는 옵션을 알고 싶다면 (Pdb) 프롬프트 다음에 Tab 키를 두 번 누르세요.

이제 계속을 입력하면 다음과 같은 출력이 표시됩니다.

student@ubuntu:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pdb_example
>>> import pdb
>>> pdb.run('pdb_example.Student(5).print_std()')
> (1)()
(Pdb) continue
0
1
2
3
4
>>>

명령줄에서 디버깅 실행

#🎜 🎜# 도구를 설치하는 가장 쉽고 직접적인 방법은 명령줄을 이용하는 것입니다. 우리 프로그램은 디버거에 대한 입력 역할을 합니다. 다음과 같이 명령줄에서 디버거를 사용할 수 있습니다.
$ python3 -m pdb pdb_example.py
명령줄에서 디버거를 실행하면 소스 코드가 로드되고 발견된 첫 번째 줄에서 실행이 중지됩니다. 디버깅을 계속하려면 계속을 입력하세요. 출력은 다음과 같습니다.

student@ubuntu:~$ python3 -m pdb pdb_example.py
> /home/student/pdb_example.py(1)()
-> class Student:
(Pdb) continue
0
1
2
3
4
The program finished and will be restarted
> /home/student/pdb_example.py(1)()
-> class Student:
(Pdb)

Python 스크립트에서

처음 두 기술은 Python 프로그램이 시작될 때 디버거를 시작합니다. 그러나 이 세 번째 기술은 장기 실행 프로세스에 가장 적합합니다. 스크립트에서 디버거를 시작하려면 set_trace()를 사용하세요. 이제 pdb_example.py 파일을 다음과 같이 수정하세요.

import pdb
class Student:
            def __init__(self, std):
                        self.count = std
 
            def print_std(self):
                        for i in range(self.count):
                                    pdb.set_trace()
                                    print(i)
                        return
 
if __name__ == '__main__':
            Student(5).print_std()

现在,按如下方式运行程序:

student@ubuntu:~$ python3 pdb_example.py
> /home/student/pdb_example.py(10)print_std()
-> print(i)
(Pdb) continue
0
> /home/student/pdb_example.py(9)print_std()
-> pdb.set_trace()
(Pdb)

set_trace() 是一个Python函数,因此您可以在程序中的任何位置调用它。

因此,这些是启动调试器的三种方式。

调试基本程序崩溃

在本节中,我们将看到跟踪模块。跟踪模块有助于跟踪程序执行。因此,每当您的Python程序崩溃时,我们都可以理解崩溃的位置。我们可以通过将跟踪模块导入您的脚本以及命令行来使用它。

现在,我们将创建一个名为脚本trace_example.py并在脚本中编写以下内容:

class Student:
            def __init__(self, std):
                        self.count = std
 
            def go(self):
                        for i in range(self.count):
                                    print(i)
                        return
if __name__ == '__main__':
            Student(5).go()

输出如下:

student@ubuntu:~$ python3 -m trace --trace trace_example.py
 --- modulename: trace_example, funcname: trace_example.py(1): class Student:
 --- modulename: trace_example, funcname: Student
trace_example.py(1): class Student:
trace_example.py(2):   def __init__(self, std):
trace_example.py(5):   def go(self):
trace_example.py(10): if __name__ == '__main__':
trace_example.py(11):             Student(5).go()
 --- modulename: trace_example, funcname: init
trace_example.py(3):               self.count = std
 --- modulename: trace_example, funcname: go
trace_example.py(6):               for i in range(self.count):
trace_example.py(7):                           print(i)
0
trace_example.py(6):               for i in range(self.count):
trace_example.py(7):                           print(i)
1
trace_example.py(6):               for i in range(self.count):
trace_example.py(7):                           print(i)
2
trace_example.py(6):               for i in range(self.count):
trace_example.py(7):                           print(i)
3
trace_example.py(6):               for i in range(self.count):
trace_example.py(7):                           print(i)
4

因此,通过trace --trace在命令行使用,开发人员可以逐行跟踪程序。因此,只要程序崩溃,开发人员就会知道崩溃的实例。

分析和计时程序

分析Python程序意味着测量程序的执行时间。它衡量每个功能所花费的时间。Python的cProfile模块用于分析Python程序。

cProfile模块

如前所述,分析意味着测量程序的执行时间。我们将使用cProfile Python模块来分析程序。

现在,我们将编写一个 cprof_example.py 脚本并在其中编写以下代码:

mul_value = 0
def mul_numbers( num1, num2 ):
            mul_value = num1 * num2;
            print ("Local Value: ", mul_value)
            return mul_value
mul_numbers( 58, 77 )
print ("Global Value: ", mul_value)

运行程序,您将看到如下输出:

student@ubuntu:~$ python3 -m cProfile cprof_example.py
Local Value:  4466
Global Value:  0
         6 function calls in 0.000 seconds
   Ordered by: standard name
 
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 cprof_example.py:1()
        1    0.000    0.000    0.000    0.000 cprof_example.py:2(mul_numbers)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        2    0.000    0.000    0.000    0.000 {built-in method builtins.print}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

因此,使用时cProfile,所有被调用的函数都将打印出每个函数所花费的时间。现在,我们将看到这些列标题的含义:

· ncalls: 通话次数

· tottime: 在给定函数中花费的总时间

· percall:商数tottime除以ncalls

· cumtime:在此和所有方面花费的累计时间 subfunctions

· percall:cumtime除以原始调用的商数

· filename:lineno(function):提供每个功能的相应数据

timeit

timeit是一个Python模块,用于计算Python脚本的一小部分。您可以从命令行调用timeit,也可以将timeit模块导入到脚本中。我们将编写一个脚本来计算一段代码。创建一个timeit_example.py脚本并将以下内容写入其中:

import timeit
prg_setup = "from math import sqrt"
prg_code = '''
def timeit_example():
            list1 = []
            for x in range(50):
                        list1.append(sqrt(x))
'''
# timeit statement
print(timeit.timeit(setup = prg_setup, stmt = prg_code, number = 10000))

使用timeit,我们可以决定我们要测量的代码片段。因此,我们可以轻松定义设置代码以及我们要单独执行测试的代码段。主代码运行100万次,这是默认时间,而设置代码只运行一次。

使程序运行得更快

有多种方法可以使Python程序运行得更快,例如:

  • 描述您的代码,以便识别瓶颈
  • 使用内置函数和库,因此解释器不需要执行循环
  • 避免使用全局变量,因为Python在访问全局变量时非常慢
  • 使用现有包

위 내용은 Python 스크립트 디버깅 및 분석(코드 예제)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제