摘要:調(diào)試器可幫助程序員分析完整的代碼。我們將使用標(biāo)準(zhǔn)庫中的模塊調(diào)試我們的腳本。例外是程序執(zhí)行期間發(fā)生的錯(cuò)誤。設(shè)置斷點(diǎn)并檢查堆棧幀,并列出源代碼。輸入以繼續(xù)調(diào)試。分析和計(jì)時(shí)程序分析程序意味著測量程序的執(zhí)行時(shí)間。的模塊用于分析程序。
來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯
愿碼Slogan | 連接每個(gè)程序員的故事
網(wǎng)站 | http://chaindesk.cn
愿碼愿景 | 打造全學(xué)科IT系統(tǒng)免費(fèi)課程,助力小白用戶、初級(jí)工程師0成本免費(fèi)系統(tǒng)學(xué)習(xí)、低成本進(jìn)階,幫助BAT一線資深工程師成長并利用自身優(yōu)勢創(chuàng)造睡后收入。
官方公眾號(hào) | 愿碼 | 愿碼服務(wù)號(hào) | 區(qū)塊鏈部落
免費(fèi)加入愿碼全思維工程師社群 | 任一公眾號(hào)回復(fù)“愿碼”兩個(gè)字獲取入群二維碼
本文閱讀時(shí)長:11min
調(diào)試和分析在Python開發(fā)中發(fā)揮重要作用 。調(diào)試器可幫助程序員分析完整的代碼。調(diào)試器設(shè)置斷點(diǎn),而分析器運(yùn)行我們的代碼并向我們提供執(zhí)行時(shí)間的詳細(xì)信息,分析器將識(shí)別程序中的瓶頸。
Python調(diào)試技術(shù)調(diào)試是一個(gè)解決代碼中出現(xiàn)的問題并阻止軟件正常運(yùn)行的過程。在Python中,調(diào)試非常簡單。Python調(diào)試器設(shè)置條件斷點(diǎn)并一次調(diào)試一行源代碼。我們將使用pdb Python標(biāo)準(zhǔn)庫中的模塊調(diào)試我們的Python腳本 。
為了更好地調(diào)試Python程序,可以使用各種技術(shù)。我們將討論P(yáng)ython調(diào)試的四種技術(shù):
print() 聲明:這是了解發(fā)生了什么的最簡單方法,因此您可以檢查已執(zhí)行的內(nèi)容。
logging:這就像一個(gè)print聲明,但有更多的上下文信息,所以你可以完全理解它。
pdb debugger:這是一種常用的調(diào)試技術(shù)。使用的優(yōu)點(diǎn)pdb是您可以pdb從命令行,解釋器和程序中使用。
IDE調(diào)試器:IDE具有集成調(diào)試器。它允許開發(fā)人員執(zhí)行他們的代碼,然后開發(fā)人員可以在程序執(zhí)行時(shí)進(jìn)行檢查。
錯(cuò)誤處理(異常處理)在本節(jié)中,我們將學(xué)習(xí)Python如何處理異常。例外是程序執(zhí)行期間發(fā)生的錯(cuò)誤。每當(dāng)發(fā)生任何錯(cuò)誤時(shí),Python都會(huì)生成一個(gè)異常,該異常將使用try ... except塊進(jìn)行處理。程序無法處理某些異常,因此會(huì)導(dǎo)致錯(cuò)誤消息。現(xiàn)在,我們將看到一些異常示例。
在終端中,啟動(dòng) python3交互式控制臺(tái),我們將看到一些異常示例:
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 ZeroDivisionError: division 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" >>>
這些是例外的一些例子?,F(xiàn)在,我們將看到我們?nèi)绾翁幚懋惓!?/p>
每當(dāng)Python程序中發(fā)生錯(cuò)誤時(shí),都會(huì)引發(fā)異常。我們還可以使用raise關(guān)鍵字強(qiáng)制引發(fā)異常。
現(xiàn)在我們將看到一個(gè)try…except處理異常的塊。在try塊中,我們將編寫可能生成異常的代碼。在except塊中,我們將為該異常編寫解決方案。
語法 try…except如下:
try: statement(s) except: statement(s)
一個(gè)try塊可以有多個(gè)except語句。我們也可以通過在except關(guān)鍵字后面輸入例外名稱來處理特定的例外。處理特定異常的語法如下:
try: statement(s) except exception_name: statement(s)
我們將創(chuàng)建一個(gè)exception_example.py 要捕獲的腳本ZeroDivisionError。在腳本中編寫以下代碼:
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("Division by zero is not possible") print("Out of try...except block")
按如下所示運(yùn)行腳本,您將獲得以下輸出:
student@ubuntu:~$ python3 exception_example.py The value of c is: 92 Division by zero is not possible Out of try...except block調(diào)試器工具
Python支持許多調(diào)試工具:
winpdb
pydev
pydb
pdb
gdb
pyDebug
在本節(jié)中,我們將學(xué)習(xí)pdb Python調(diào)試器。pdbmodule是Python標(biāo)準(zhǔn)庫的一部分,始終可供使用。
該pdb模塊用于調(diào)試Python程序。Python程序使用pdb交互式源代碼調(diào)試器來調(diào)試程序。pdb設(shè)置斷點(diǎn)并檢查堆棧幀,并列出源代碼。
現(xiàn)在我們將了解如何使用pdb調(diào)試器。有三種方法可以使用此調(diào)試器:
· 在解釋器中
· 從命令行
· 在Python腳本中
我們將創(chuàng)建一個(gè)pdb_example.py腳本并在該腳本中添加以下內(nèi)容:
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()
以此腳本為例學(xué)習(xí)Python調(diào)試,我們將看到如何詳細(xì)啟動(dòng)調(diào)試器。
在解釋器中要從Python交互式控制臺(tái)啟動(dòng)調(diào)試器,我們使用run()或runeval()。
啟動(dòng)python3交互式控制臺(tái)。運(yùn)行以下命令以啟動(dòng)控制臺(tái):
$ python3
導(dǎo)入我們的 pdb_example腳本名稱和pdb模塊?,F(xiàn)在,我們將使用run()并且我們將字符串表達(dá)式作為參數(shù)傳遞給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)
要繼續(xù)調(diào)試,請(qǐng)continue在(Pdb)提示符后輸入并按Enter鍵。如果你想知道我們可以在這里使用的選項(xiàng),那么在(Pdb)提示后按兩次Tab 鍵。
現(xiàn)在,輸入后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 >>>從命令行
運(yùn)行調(diào)試器的最簡單,最直接的方法是從命令行。我們的程序?qū)⒆鳛檎{(diào)試器的輸入。您可以從命令行使用調(diào)試器,如下所示:
$ python3 -m pdb pdb_example.py
從命令行運(yùn)行調(diào)試器時(shí),將加載源代碼,它將停止在找到的第一行執(zhí)行。輸入continue以繼續(xù)調(diào)試。這是輸出:
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腳本中
前兩種技術(shù)將在Python程序開始時(shí)啟動(dòng)調(diào)試器。但這第三種技術(shù)最適合長期運(yùn)行的流程。要在腳本中啟動(dòng)調(diào)試器,請(qǐng)使用set_trace()。
現(xiàn)在,修改您的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()
現(xiàn)在,按如下方式運(yùn)行程序:
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() 是一個(gè)Python函數(shù),因此您可以在程序中的任何位置調(diào)用它。
因此,這些是啟動(dòng)調(diào)試器的三種方式。
調(diào)試基本程序崩潰在本節(jié)中,我們將看到跟蹤模塊。跟蹤模塊有助于跟蹤程序執(zhí)行。因此,每當(dāng)您的Python程序崩潰時(shí),我們都可以理解崩潰的位置。我們可以通過將跟蹤模塊導(dǎo)入您的腳本以及命令行來使用它。
現(xiàn)在,我們將創(chuàng)建一個(gè)名為腳本trace_example.py并在腳本中編寫以下內(nèi)容:
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在命令行使用,開發(fā)人員可以逐行跟蹤程序。因此,只要程序崩潰,開發(fā)人員就會(huì)知道崩潰的實(shí)例。
分析和計(jì)時(shí)程序分析Python程序意味著測量程序的執(zhí)行時(shí)間。它衡量每個(gè)功能所花費(fèi)的時(shí)間。Python的cProfile模塊用于分析Python程序。
如前所述,分析意味著測量程序的執(zhí)行時(shí)間。我們將使用cProfile Python模塊來分析程序。
現(xiàn)在,我們將編寫一個(gè) 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)
運(yùn)行程序,您將看到如下輸出:
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}
因此,使用時(shí)cProfile,所有被調(diào)用的函數(shù)都將打印出每個(gè)函數(shù)所花費(fèi)的時(shí)間?,F(xiàn)在,我們將看到這些列標(biāo)題的含義:
· ncalls: 通話次數(shù)
· tottime: 在給定函數(shù)中花費(fèi)的總時(shí)間
· percall:商數(shù)tottime除以ncalls
· cumtime:在此和所有方面花費(fèi)的累計(jì)時(shí)間 subfunctions
· percall:cumtime除以原始調(diào)用的商數(shù)
· filename:lineno(function):提供每個(gè)功能的相應(yīng)數(shù)據(jù)
timeit是一個(gè)Python模塊,用于計(jì)算Python腳本的一小部分。您可以從命令行調(diào)用timeit,也可以將timeit模塊導(dǎo)入到腳本中。我們將編寫一個(gè)腳本來計(jì)算一段代碼。創(chuàng)建一個(gè)timeit_example.py腳本并將以下內(nèi)容寫入其中:
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,我們可以決定我們要測量的代碼片段。因此,我們可以輕松定義設(shè)置代碼以及我們要多帶帶執(zhí)行測試的代碼段。主代碼運(yùn)行100萬次,這是默認(rèn)時(shí)間,而設(shè)置代碼只運(yùn)行一次。
使程序運(yùn)行得更快有多種方法可以使Python程序運(yùn)行得更快,例如:
描述您的代碼,以便識(shí)別瓶頸
使用內(nèi)置函數(shù)和庫,因此解釋器不需要執(zhí)行循環(huán)
避免使用全局變量,因?yàn)镻ython在訪問全局變量時(shí)非常慢
使用現(xiàn)有包
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43552.html
摘要:函數(shù)將單元格內(nèi)容以形式呈現(xiàn)。自動(dòng)評(píng)論代碼自動(dòng)注釋單元格中的選定行,再次命中組合將取消注釋相同的代碼行。如果需要恢復(fù)整個(gè)已刪除的單元格,請(qǐng)按或撤消刪除單元格。 showImg(https://segmentfault.com/img/remote/1460000019599210); 編譯:小七、蔣寶尚 一些小提示和小技巧可能是非常有用的,特別是在編程領(lǐng)域。有時(shí)候使用一點(diǎn)點(diǎn)黑客技術(shù),既可...
摘要:你可以進(jìn)行如下操作需要注意的是這個(gè)竅門只適用于。在中就不需要進(jìn)行操作了,因?yàn)樗呀?jīng)默認(rèn)進(jìn)行了。這里有幾個(gè)例子可以供你參考譯文出處本文根據(jù)的所譯,整個(gè)譯文帶有我自己的理解與思想,如果譯得不好或有不對(duì)之處還請(qǐng)同行朋友指點(diǎn)。 枚舉 不要這么做: i = 0 for item in iterable: print i, item i += 1 而是這樣: for...
摘要:首先要打開微信,進(jìn)入到指定的群聊,識(shí)別微信紅包執(zhí)行搶紅包的動(dòng)作。是一款基于控件識(shí)別的自動(dòng)化測試框架,目前支持原生原生微信小程序,也可以在其他引擎中自行接入來使用。 showImg(https://segmentfault.com/img/remote/1460000019438856); 目錄:0 引言1 環(huán)境2 需求分析3 前置準(zhǔn)備4 搶紅包流程回顧5 代碼梳理6 后記 0 引言 提...
摘要:換句話說就是,讓測試更有針對(duì)性。得益于強(qiáng)大的測試技術(shù),兼容性測試的檢出率遠(yuǎn)遠(yuǎn)高于業(yè)界水平。同時(shí),在性能測試方面,即提供了項(xiàng)性能指標(biāo)曲線性能分析,更提供了強(qiáng)大的內(nèi)存泄漏和內(nèi)存溢出的檢測和分析能力。 摘要: Android兼容性測試旨在幫助解決Android應(yīng)用在不同真機(jī)機(jī)型上的各類兼容性問題,包括 Crash/ANR分析、6項(xiàng)性能分析、UI檢測、3個(gè)版本的覆蓋安裝檢測等。Android兼...
摘要:簡單介紹自帶庫,使用調(diào)試程序還是很方便的。比如下圖就是展示斷點(diǎn)進(jìn)入到內(nèi)部之后,打印的參數(shù),打印某個(gè)變量退出調(diào)試,直接退出調(diào)試或者使用的方式退出最后說一句上面展示的使用調(diào)試的過程其實(shí)是很簡單的,文章中主要通過截圖展示運(yùn)行的效果。 簡單介紹 Python自帶 Pdb庫,使用 Pdb調(diào)試 Python程序還是很方便的。但是遠(yuǎn)程調(diào)試、多線程,Pdb是搞不定的 本文參考的相關(guān)文章如下: 《指針...
閱讀 2017·2021-11-23 10:08
閱讀 2352·2021-11-22 15:25
閱讀 3286·2021-11-11 16:55
閱讀 785·2021-11-04 16:05
閱讀 2626·2021-09-10 10:51
閱讀 722·2019-08-29 15:38
閱讀 1596·2019-08-29 14:11
閱讀 3496·2019-08-29 12:42