欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用pdb模塊調(diào)試Python程序?qū)嵗?/h1>
 更新時(shí)間:2015年06月02日 16:34:59   投稿:junjie  
這篇文章主要介紹了使用pdb模塊調(diào)試Python程序?qū)嵗?本文著重講解了pdb.run()函數(shù)、pdb.runeval()函數(shù)、pdb.runcall()函數(shù)、pdb.set_trace()函數(shù)的使用以及pdb調(diào)試命令等內(nèi)容,需要的朋友可以參考下

在Python中,語法錯(cuò)誤可以被Python解釋器發(fā)現(xiàn),但邏輯上錯(cuò)誤或變量使用錯(cuò)誤卻不容易發(fā)現(xiàn),如果結(jié)果沒有符合預(yù)期,則需要調(diào)試,一個(gè)很好的調(diào)試工具:Python自帶的pdb模塊。pdb是Python自帶的調(diào)試模塊。使用pdb模塊可以為腳本設(shè)置斷點(diǎn)、單步執(zhí)行、查看變量值等。

pdb可以用命令行參數(shù)的方式啟動(dòng),也可以使用import 將其導(dǎo)入后再使用。

復(fù)制代碼 代碼如下:

>>> dir(pdb) 
['Pdb', 'Repr', 'Restart', 'TESTCMD',.....,'re', 'run', 'runcall', 'runctx', 'runeval', 'set_trace', 'sys', 'test', 'traceback'] 

常見的pdb函數(shù)有以下幾個(gè):

【pdb.run()函數(shù)】

>>> 該函數(shù)主要用于調(diào)試語句塊
>>> 基本用法如下

復(fù)制代碼 代碼如下:

>>> help(pdb.run) 
Help on function run in module pdb: 
 
run(statement, globals=None, locals=None) 
>>>參數(shù)含義

statement: 要調(diào)試的語句塊,以字符串的形式表示
globals:   可選參數(shù),設(shè)置statement運(yùn)行的全局環(huán)境變量
locals:     可選參數(shù),設(shè)置statement運(yùn)行的局部環(huán)境變量
>>>簡單示例

復(fù)制代碼 代碼如下:

>>> import pdb                # 導(dǎo)入調(diào)試模塊 
>>> pdb.run('''''               # 調(diào)用run()函數(shù)執(zhí)行一個(gè)for循環(huán)
for i in range(3):
    i *= 3
    print(i)
    ''') 
> <string>(2)<module>()      
(Pdb) n                       # (Pdb)為調(diào)試命令提示符,表示可輸入調(diào)試命令 
> <string>(3)<module>() 
(Pdb) n                       # n(next)表示執(zhí)行下一行 
> <string>(4)<module>() 
(Pdb) print(i)                # 打印變量i的值 

(Pdb) continue                # 繼續(xù)運(yùn)行程序 



【pdb.runeval()函數(shù)】
>>>該函數(shù)主要用于調(diào)試表達(dá)式
>>>基本用法如下

復(fù)制代碼 代碼如下:

>>> help(pdb.runeval) 
Help on function runeval in module pdb: 
 
runeval(expression, globals=None, locals=None) 

>>> 參數(shù)含義

expression: 要調(diào)試的,
globals:   可選參數(shù),設(shè)置statement運(yùn)行的全局環(huán)境變量
locals:     可選參數(shù),設(shè)置statement運(yùn)行的局部環(huán)境變量

>>> 簡單示例

復(fù)制代碼 代碼如下:

>>> import pdb                  # 導(dǎo)入pdb模塊 
>>> lst = [1, 2, 3]             # 定義一個(gè)列表 
>>> pdb.runeval('lst[1]')       # 調(diào)用runaval()函數(shù)來調(diào)試表達(dá)式lst[1] 
> <string>(1)<module>() 
(Pdb) n                         # 進(jìn)入調(diào)試狀態(tài),使用n命令,單步執(zhí)行 
--Return-- 
> <string>(1)<module>()->2 
(Pdb) n                         # 單步執(zhí)行 
2                               # 返回表達(dá)式的值 
>>> pdb.runeval('3 + 5*6/2')    # 使用runaval()函數(shù)來調(diào)試表達(dá)式3+5*6/2 
> <string>(1)<module>()->2 
(Pdb) n 
--Return-- 
> <string>(1)<module>()->18 
(Pdb) n                         # 使用n命令單步執(zhí)行 
18                              # 最后得出表達(dá)式的值 

【pdb.runcall()函數(shù)】

>>>該函數(shù)主要用于調(diào)試函數(shù)
>>>基本用法如下

復(fù)制代碼 代碼如下:

>>> help(pdb.runcall) 
Help on function runcall in module pdb: 
 
runcall(*args, **kwds) 

>>> 參數(shù)含義
function:          函數(shù)名
args(kwds):        函數(shù)的參數(shù)
>>> 簡單示例

復(fù)制代碼 代碼如下:

>>> import pdb                           # 導(dǎo)入模塊 
>>> def sum(*args):                      # 定義函數(shù)sum,求所有參數(shù)之和 
    res = 0 
    for arg in args: 
        res += arg 
    return res 
 
>>> pdb.runcall(sum, 1, 2, 3, 4)         # 使用runcall調(diào)試函數(shù)sum 
> <pyshell#53>(2)sum() 
(Pdb) n                                  # 進(jìn)入調(diào)試狀態(tài),單步執(zhí)行 
> <pyshell#53>(3)sum() 
(Pdb) n                                  # 單步執(zhí)行 
> <pyshell#53>(4)sum()        
(Pdb) print(res)                         # 使用print打印res的值 

(Pdb) continue                           # 繼續(xù)執(zhí)行 
10 
>>> pdb.runcall(sum, 1, 2, 3, 4, 5, 6)   # 調(diào)用runcall調(diào)試函數(shù)sum,參數(shù)不同 
 
> <pyshell#53>(2)sum()                
(Pdb) continue                           # 繼續(xù)執(zhí)行 
21                                       # 函數(shù)最后返回結(jié)果 

【pdb.set_trace()函數(shù)】

>>>該函數(shù)主要用于腳本中設(shè)置硬斷點(diǎn)
>>>基本用法如下

復(fù)制代碼 代碼如下:

>>> help(pdb.set_trace) 
Help on function set_trace in module pdb: 
 
set_trace() 

>>>簡單示例

復(fù)制代碼 代碼如下:

# file: test.py 
 
import pdb 
 
pdb.set_trace() 
for i in range(5): 
    i *= 5 
    print(i) 

運(yùn)行腳本后顯示:

復(fù)制代碼 代碼如下:

> d:\learn\python\test.py(6)<module>() 
-> for i in range(5): 
(Pdb) list                     # 使用list列出腳本內(nèi)容 
  1     # file: test.py 
  2      
  3     import pdb 
  4      
  5     pdb.set_trace()        # 使用set_trace()設(shè)置硬斷點(diǎn) 
  6  ->  for i in range(5): 
  7         i *= 5 
  8         print(i) 
[EOF]                          # 列出腳本內(nèi)容結(jié)束 
(Pdb) continue                 # 使用continue繼續(xù)執(zhí)行 


10 
15 
20 

【pdb調(diào)試命令】
pdb中的調(diào)試命令可以完成單步執(zhí)行、打印變量值、設(shè)置斷點(diǎn)等功能。pdb主要命令如下

復(fù)制代碼 代碼如下:

------------------------------------------------------------------------------ 
# 完整命令                    簡寫命令                      描述 
------------------------------------------------------------------------------ 
# args                         a                            打印當(dāng)前函數(shù)的參數(shù) 
# break                        b                            設(shè)置斷點(diǎn) 
# clear                        cl                           清除斷點(diǎn) 
# condition                    無                           設(shè)置條件斷點(diǎn) 
# continue                     c                            繼續(xù)運(yùn)行,直到遇到斷點(diǎn)或者腳本結(jié)束 
# disable                      無                           禁用斷點(diǎn) 
# enable                       無                           啟用斷點(diǎn) 
# help                          h                           查看pdb幫助 
# ignore                       無                           忽略斷點(diǎn) 
# jump                         j                            跳轉(zhuǎn)到指定行數(shù)運(yùn)行 
# list                         l                            列出腳本清單 
# next                         n                            執(zhí)行下條語句,遇到函數(shù)不進(jìn)入其內(nèi)部 
# print                        p                            打印變量值 
# quit                         q                            退出pdb 
# return                       r                            一致運(yùn)行到函數(shù)返回 
# tbreak                       無                           設(shè)置臨時(shí)斷點(diǎn)、斷點(diǎn)只中斷一次 
# step                         s                            執(zhí)行下一條語句,遇到函數(shù)進(jìn)入其內(nèi)部 
# where                        w                            查看所在的位置 
# !                           無                           在pdb中執(zhí)行語句                     

>>>簡單示例
復(fù)制代碼 代碼如下:

# -*- coding:gbk -*- 
# file: prime.py 

import math 
# isprime函數(shù)判斷一個(gè)整數(shù)是否為素?cái)?shù) 
# 如果i能被2到i的平方根內(nèi)的任意一個(gè)數(shù)整除, 
# 則i不是素?cái)?shù),返回0,否則i是素?cái)?shù),返回1。 
def isprime(i): 
    for t in range(2, int(math.sqrt(i)) + 1): 
        if i % t == 0: 
            return 0 
 
 
print('100~110之間素?cái)?shù)有: ') 
for i in range(100, 110): 
    if isprime(i): 
        print(i) 

先運(yùn)行下面命令:

復(fù)制代碼 代碼如下:

d:\Learn\Python>python -m pdb prime.py 

后輸入以下命令:

復(fù)制代碼 代碼如下:

d:\Learn\Python>python -m pdb prime.py 
> d:\learn\python\prime.py(4)<module>() 
-> import math 
(Pdb) list                                           # 運(yùn)行前面命令后停在這里,list默認(rèn)只列出11行 
  1     # -*- coding:gbk -*- 
  2     # file: prime.py 
  3     # 
  4  -> import math 
  5     # isprime函數(shù)判斷一個(gè)整數(shù)是否為素?cái)?shù) 
  6     # 如果i能被2到i的平方根內(nèi)的任意一個(gè)數(shù)整除, 
  7     # 則i不是素?cái)?shù),返回0,否則i是素?cái)?shù),返回1。 
  8     def isprime(i): 
  9         for t in range(2, int(math.sqrt(i)) + 1): 
 10             if i % t == 0: 
 11                 return 0 
(Pdb) l 14,17                                        # 使用list命令,列出14行,到17行 
 14     print('100~110之間素?cái)?shù)有: ') 
 15     for i in range(100, 110): 
 16         if isprime(i): 
 17             print(i) 
(Pdb) b 14                                           # 使用break命令設(shè)置斷點(diǎn) 
Breakpoint 1 at d:\learn\python\prime.py:14          # 返回?cái)帱c(diǎn)編號(hào): 1 
(Pdb) b isprime                                      # 在函數(shù)isprime設(shè)置斷點(diǎn) 
Breakpoint 2 at d:\learn\python\prime.py:8           # 返回?cái)帱c(diǎn)編號(hào): 2 
(Pdb) c                                              # 使用c命令運(yùn)行運(yùn)行腳本 
> d:\learn\python\prime.py(14)<module>()             # 停在斷點(diǎn)1處,即第14行 
-> print('100~110之間素?cái)?shù)有: ') 
(Pdb) c                                              # 使用c命令繼續(xù)運(yùn)行腳本 
100~110之間素?cái)?shù)有:                                   # 第14行腳本輸出 
> d:\learn\python\prime.py(9)isprime()               # 停在斷點(diǎn)2,即isprime函數(shù)處 
-> for t in range(2, int(math.sqrt(i)) + 1): 
(Pdb) b 15                                           # 在第15行處設(shè)置斷點(diǎn) 
Breakpoint 3 at d:\learn\python\prime.py:15 
(Pdb) disable 2                                      # 禁用斷點(diǎn)2,即isprime函數(shù)處的斷點(diǎn) 
(Pdb) c                                              # 使用c命令繼續(xù)運(yùn)行腳本 
> d:\learn\python\prime.py(15)<module>()             # 停在斷點(diǎn)3處,即第15行 
-> for i in range(100, 110): 
(Pdb) print(i)                                       # 使用print打印變量i的值 
100 
(Pdb) c                                              # 繼續(xù)運(yùn)行腳本 
> d:\learn\python\prime.py(15)<module>() 
-> for i in range(100, 110): 
(Pdb) p i                                            # 打印i的值 
101 
(Pdb) enable 2                                       # 恢復(fù)斷點(diǎn)2,即isprime函數(shù)處的斷點(diǎn) 
(Pdb) c                                              # 繼續(xù)運(yùn)行腳本 
> d:\learn\python\prime.py(9)isprime()                
-> for t in range(2, int(math.sqrt(i)) + 1): 
(Pdb) n                                              # 單步執(zhí)行下一條語句                                           
> d:\learn\python\prime.py(10)isprime() 
-> if i % t == 0: 
(Pdb) print(t)                                       # 使用print打印變量t的值 

(Pdb) cl                                             # 清楚所有斷點(diǎn),輸入y確認(rèn) 
Clear all breaks? y 
(Pdb) c                                              # 繼續(xù)運(yùn)行腳本 
103 
105 
107 
109 
(Pdb) q                                              # 使用quit(q)退出pdb調(diào)試 

相關(guān)文章

最新評(píng)論