旗下导航:搜·么
当前位置:网站首页 > Python教程 > 正文

Python剧本的调试和剖析(代码示例)【Python教程】,分析,调试,python

作者:搜教程发布时间:2019-11-27分类:Python教程浏览:30评论:0


导读:本篇文章给人人带来的内容是关于Python剧本的调试和剖析(代码示例),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。调试和剖析在Python开辟中发挥重要...
本篇文章给人人带来的内容是关于Python剧本的调试和剖析(代码示例),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。

调试和剖析在Python开辟中发挥重要作用 。调试器可协助顺序员剖析完整的代码。调试器设置断点,而剖析器运转我们的代码并向我们供应实行时候的细致信息,剖析器将辨认顺序中的瓶颈。

Python调试手艺

调试是一个处置惩罚代码中涌现的题目并阻挠软件一般运转的历程。在Python中,调试非常简朴。Python调试器设置前提断点并一次调试一行源代码。我们将运用pdb Python规范库中的模块调试我们的Python剧本 。

为了更好地调试Python顺序,能够运用种种手艺。我们将议论Python调试的四种手艺:

  • print() 声明:这是相识发作了什么的最简朴要领,因而您能够搜检已实行的内容。
  • logging:这就像一个print声明,但有更多的上下文信息,所以你能够完整明白它。
  • pdb debugger:这是一种经常使用的调试手艺。运用的长处pdb是您能够pdb从敕令行,诠释器和顺序中运用。
  • IDE调试器:IDE具有集成调试器。它许可开辟人员实行他们的代码,然后开辟人员能够在顺序实行时举行搜检。

毛病处置惩罚(非常处置惩罚)

在本节中,我们将进修Python怎样处置惩罚非常。破例是顺序实行时期发作的毛病。每当发作任何毛病时,Python都邑生成一个非常,该非常将运用try ... except块举行处置惩罚。顺序没法处置惩罚某些非常,因而会致使毛病音讯。如今,我们将看到一些非常示例。

在终端中,启动 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…except处置惩罚非常的块。在try块中,我们将编写能够生成非常的代码。在except块中,我们将为该非常编写处置惩罚方案。

语法 try…except以下:

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

一个try块能够有多个except语句。我们也能够经由过程在except关键字背面输入破例称号来处置惩罚特定的破例。处置惩罚特定非常的语法以下:

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

我们将建立一个exception_example.py 要捕捉的剧本ZeropisionError在剧本中编写以下代码:

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

调试器东西

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)

要继承调试,请continue在(Pdb)提醒符后输入并按Enter键。假如你想晓得我们能够在这里运用的选项,那末在(Pdb)提醒后按两次Tab 键。

如今,输入后continue,我们将取得以下输出:

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

从敕令行运转调试器时,将加载源代码,它将住手在找到的第一行实行。输入continue以继承调试。这是输出:

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剧本的调试和剖析(代码示例)的细致内容,更多请关注ki4网别的相干文章!

标签:分析调试python


欢迎 发表评论: