1. python語言中如何調試程序
把關鍵的中間變數print出來,看看是不是和預期的一樣。
2. 如何調式python程序
程序能一次寫完並正常運行的概率很小,基本不超過1%。總會有各種各樣的bug需要修正。有的bug很簡單,看看錯誤信息就知道,有的bug很復雜,我們需要知道出錯時,哪些變數的值是正確的,哪些變數的值是錯誤的,因此,需要一整套調試程序的手段來修復bug。
第一種方法簡單直接粗暴有效,就是用print把可能有問題的變數列印出來看看:
# err.py
def foo(s):
n = int(s)
print '>>> n = %d' % n
return 10 / n
def main():
foo('0')
main()
執行後在輸出中查找列印的變數值:
$ python err.py
>>> n = 0
Traceback (most recent call last):
...
ZeroDivisionError: integer division or molo by zero
用print最大的壞處是將來還得刪掉它,想想程序里到處都是print,運行結果也會包含很多垃圾信息。所以,我們又有第二種方法。
斷言
凡是用print來輔助查看的地方,都可以用斷言(assert)來替代:
# err.py
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
def main():
foo('0')
assert的意思是,表達式n != 0應該是True,否則,後面的代碼就會出錯。
如果斷言失敗,assert語句本身就會拋出AssertionError:
$ python err.py
Traceback (most recent call last):
...
AssertionError: n is zero!
程序中如果到處充斥著assert,和print相比也好不到哪去。不過,啟動Python解釋器時可以用-O參數來關閉assert:
$ python -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: integer division or molo by zero
關閉後,你可以把所有的assert語句當成pass來看。
logging
把print替換為logging是第3種方式,和assert比,logging不會拋出錯誤,而且可以輸出到文件:
# err.py
import logging
s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n
logging.info()就可以輸出一段文本。運行,發現除了ZeroDivisionError,沒有任何信息。怎麼回事?
別急,在import logging之後添加一行配置再試試:
import logging
logging.basicConfig(level=logging.INFO)
看到輸出了:
$ python err.py
INFO:root:n = 0
Traceback (most recent call last):
File "err.py", line 8, in <mole>
print 10 / n
ZeroDivisionError: integer division or molo by zero
這就是logging的好處,它允許你指定記錄信息的級別,有debug,info,warning,error等幾個級別,當我們指定
level=INFO時,logging.debug就不起作用了。同理,指定level=WARNING後,debug和info就不起作用了。這樣一
來,你可以放心地輸出不同級別的信息,也不用刪除,最後統一控制輸出哪個級別的信息。
logging的另一個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console和文件。
pdb
第4種方式是啟動Python的調試器pdb,讓程序以單步方式運行,可以隨時查看運行狀態。我們先准備好程序:
# err.py
s = '0'
n = int(s)
print 10 / n
然後啟動:
$ python -m pdb err.py
> /Users/michael/Github/sicp/err.py(2)<mole>()
-> s = '0'
以參數-m pdb啟動後,pdb定位到下一步要執行的代碼-> s = '0'。輸入命令l來查看代碼:
(Pdb) l
1 # err.py
2 -> s = '0'
3 n = int(s)
4 print 10 / n
[EOF]
輸入命令n可以單步執行代碼:
(Pdb) n
> /Users/michael/Github/sicp/err.py(3)<mole>()
-> n = int(s)
(Pdb) n
> /Users/michael/Github/sicp/err.py(4)<mole>()
-> print 10 / n
任何時候都可以輸入命令p 變數名來查看變數:
(Pdb) p s
'0'
(Pdb) p n
0
輸入命令q結束調試,退出程序:
(Pdb) n
ZeroDivisionError: 'integer division or molo by zero'
> /Users/michael/Github/sicp/err.py(4)<mole>()
-> print 10 / n
(Pdb) q
這種通過pdb在命令行調試的方法理論上是萬能的,但實在是太麻煩了,如果有一千行代碼,要運行到第999行得敲多少命令啊。還好,我們還有另一種調試方法。
pdb.set_trace()
這個方法也是用pdb,但是不需要單步執行,我們只需要import pdb,然後,在可能出錯的地方放一個pdb.set_trace(),就可以設置一個斷點:
# err.py
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 運行到這里會自動暫停
print 10 / n
運行代碼,程序會自動在pdb.set_trace()暫停並進入pdb調試環境,可以用命令p查看變數,或者用命令c繼續運行:
$ python err.py
> /Users/michael/Github/sicp/err.py(7)<mole>()
-> print 10 / n
(Pdb) p n
0
(Pdb) c
Traceback (most recent call last):
File "err.py", line 7, in <mole>
print 10 / n
ZeroDivisionError: integer division or molo by zero
這個方式比直接啟動pdb單步調試效率要高很多,但也高不到哪去。
IDE
如果要比較爽地設置斷點、單步執行,就需要一個支持調試功能的IDE。目前比較好的Python IDE有PyCharm:
3. linux怎麼調試python
#!/usr/bin/python
from ftplib import FTP
import sys
import socket
import pdb
def passwordCorrect(ip,port,username,password):
try:
client = FTP()
pdb.set_trace()
client.connect(ip,port)
client.login(username,password)
client.close()
except Exception, e:
pdb.set_trace()
client.close()
if str(e).find('unknown IP address')!=-1:
return 2
return 0
print "correct"
return 1
4. python 怎麼用ide調試
方法很多,你打開Python IDE(GUI)後,界面跟cmd命令行很類似,如果你寫的程序很復雜當然不適合這種方式了,可以直接-------File-NewFile,這個時候就會出來一個Untitled窗口,你在這里開始寫程序就行了,最後保存下,就是一個**.py的python程序了,至於怎麼運行它,你可以打開這個**.py文件,直接按F5就行,也可以在cmd窗口裡用python **.py都可以
5. 如何進行Python 調試器調試
PyDev 就能顯示出一個超鏈接,這樣您可以在導入庫或函數的源代碼之間導航。請注意,為了在您自己的源代碼中跨模塊使用該特性(從一個模塊鏈接到另一個模塊),必須修改 PYTHONPATH 環境變數。在其中加入這些模塊,這樣 PyDev 就可以找到它們了。Python 調試器是最近才加入 PyDev 插件中的。要使用調試器,可在 Python 編輯器中想中斷的代碼行的左側點擊,設置斷點。我在feedparser.py 的 1830 行處設置了斷點。然後在 Navigator 視圖中選擇這個 Python 模塊,點擊右鍵,選擇「Python > Debug...」。這時將顯示與前面相似的一個啟動配置窗口。點擊 Debug 進入 Debug 視角,同時啟動調試器。 左上角的 Debug 視圖顯示當前正在執行的進程和線程,右上角的 Variables 視圖顯示當前運行域中的所有變數。Python 編輯器會顯示調試器目前停在哪條語句上,同時所有的輸出信息都顯示與 Console 視圖中。調試器可以通過 Debug 視圖底部的按鈕或 Run 菜單進行控制。 要運行剛剛在 Eclipse 中創建的啟動器,可選擇 Run > External Tools > pythonInterpreter。Python 解釋器的輸出顯示在 Console 視圖中。Console 中可輸入 Python 調試器並執行,就像從命令行中執行 Python 一樣。為導入並在交互模式下使用模塊,您需要將模塊的位置增加到 PYTHONPATH 環境變數中。 Python 會在它需要的時候自動編譯模塊。這意味著 Python 調試器通常不必顯式地對模塊進行編輯。即便如此。有時候手工編譯 Python 代碼還是很有用的,同時,構建和部署過程中還有很多其他方面的內容可以自動化實現。這也正是構建工具的用武之地。 我將著重介紹來自 Java 編程世界中的 Apache Ant,這個工具可大量應用在 Python 開發中。Apache Ant 是 Java 編程領域內事實上的標准構建工具。它更加輕便,與 Java 技術結合得更好,可用於替代其他的構建工具。Ant 可以在支持 Java 編程語言的任何一種平台上運行。盡管我們需要的大多數構建特性 Ant 都已經提供了,但如果要將 Ant 用做 Python 構建工具,還是需要有一些關鍵的與 Python 相關的特性。我已經開發了若干定製的 Ant 插件(用 Ant 的行話講叫做 task),可提供構建 Python 時需要的特定於 Python 的特性。 Ant 用 XML 作為描述構建的格式。build 文件組織為需要執行的目標。每一個目標都可能依賴於其他的目標。Ant 將根據您所請求執行的目標,以及一組依賴目標,來執行任何需要的目標。每一個目標都可能包含任意數量的 Ant 任務,而由 Ant 任務實際執行目標的工作。Ant 有很多內置的任務,可以完成諸如編譯 Java 代碼、生成文檔、操縱文件和目錄,同時第三方又提供了很多附加的任務。 我將通過為 feedparser 項目創建構建腳本來介紹 Ant 構建腳本和 Python Ant 任務的基礎知識。為了使用 Python Ant 任務。您需要下載並安裝包含這些任務的 Java 庫。首先,從 參考資料 一節中列出的 URL 中下載 Python 調試器任務庫(pyAntTasks.jar)。然後,將 JAR 文件拷貝到 Eclipse 的 Ant 插件下的 lib 目錄中。這應該是 Eclipse 安裝目錄下形如 plugins/org.apache.ant_1.5.3 的子目錄。 Python Ant 任務庫拷貝完畢之後,必須在 Eclipse 中啟用庫。選擇 Window > Preferences,然後選擇 Ant > Runtime。將Ant Home Entries 展開,其中可看到 Eclipse 使用的庫(JAR 文件)列表。選擇「 Add JAR」,然後從 Eclipse Ant 插件的 lib 目錄中選擇 Python Ant JAR 文件,就可以將剛剛拷貝的 Python Ant JAR 文件加入庫列表中。您現在應該能夠創建和運行包含 Python 任務的 Ant 構建腳本了。下面進入構建腳本內部!
6. 調試python代碼的方法有哪些
本文討論在沒有方便的IDE工具可用的情況下,使用pdb調試python程序
源碼例子
例如,有模擬稅收計算的程序:
#!/usr/bin/python
def debug_demo(val):
if val <= 1600 :
print "level 1"
print 0
elif val <= 3500 :
print "level 2"
print (val - 1600) * 0.05
elif val <= 6500 :
print "level 3"
print (val - 3500) * 0.10 + (3500-1600) * 0.05
else:
print "level 4"
print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05
#~def debug_demo
if __name__ == "__main__":
debug_demo(4500)
debug_demo函數計算4500的入賬所需的稅收。
如何調試?
1.加入斷點
在需要插入斷點的地方,加入紅色部分代碼:如果_DEBUG值為True,則在該處開始調試(加入_DEBUG的原因是為了方便打開/關閉調試)。
#!/usr/bin/python
_DEBUG=True
def debug_demo(val):
if _DEBUG == True:
import pdb
pdb.set_trace()
if val <= 1600 :
print "level 1"
print 0
elif val <= 3500 :
print "level 2"
print (val - 1600) * 0.05
elif val <= 6500 :
print "level 3"
print (val - 3500) * 0.10 + (3500-1600) * 0.05
else:
print "level 4"
print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05
#~def debug_demo
if __name__ == "__main__":
debug_demo(4500)
2.開始運行調試
運行程序./debug_demo.py,得到
> /usr/local/qspace/user_network/debug_demo.py(7)debug_demo()
-> if val <= 1600 :
(Pdb)
-> val <= 1600 : 指示當前執行的語句,(Pdb)等待你的調試指令. pdb的指令很豐富,輸入h指令可以查看指令的使用方法。下面簡單介紹常用指令:
查看代碼上下文,l(小寫L)
(Pdb) l
2 _DEBUG=True
3 def debug_demo(val):
4 if _DEBUG == True:
5 import pdb
6 pdb.set_trace()
7 -> if val <= 1600 :
8 print "level 1"
9 print 0
10 elif val <= 3500 :
11 print "level 2"
12 print (val - 1600) * 0.05
(Pdb)
左邊是行號,右邊是代碼正文。
監視變數:p 變數名
(Pdb) p val
4500
(Pdb)
單步執行: n
-> elif val <= 3500 :
(Pdb) l
5 import pdb
6 pdb.set_trace()
7 if val <= 1600 :
8 print "level 1"
9 print 0
10 -> elif val <= 3500 :
11 print "level 2"
12 print (val - 1600) * 0.05
13 elif val <= 6500 :
14 print "level 3"
15 print (val - 3500) * 0.10 + (3500-1600) * 0.05
加入斷點:b 行號
(Pdb) b 14
運行到斷點: c
(Pdb) c
> /*****
-> print "level 3"
(Pdb) l
9 print 0
10 elif val <= 3500 :
11 print "level 2"
12 print (val - 1600) * 0.05
13 elif val <= 6500 :
14 B-> print "level 3"
15 print (val - 3500) * 0.10 + (3500-1600) * 0.05
16 else:
17 print "level 4"
18 print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05
19
執行到函數返回前: r
(Pdb) r
level 3
195.0
--Return--
> /****()
->None
-> print (val - 3500) * 0.10 + (3500-1600) * 0.05
(Pdb)
說明:
pdb還有很多其他很多有用的指令,讀者可以自行探索。輸入h,h 命令。就可以得到命令的詳細幫助。
不過,我個人認為一般無需啟動這種調試方法,一般使用日誌輸出進行調試即可,除非遇到了非常微妙的錯誤。這時,單步調試的威力便顯示出來了
7. python代碼怎麼debug
在需要插入斷點的地方,加入紅色部分代碼:如果_DEBUG值為True,則在該處開始調試(加入_DEBUG的原因是為了方便打開/關閉調試)。
#!/usr/bin/python
_DEBUG=True
def debug_demo(val):
if _DEBUG == True:
import pdb
pdb.set_trace()
8. python debug怎麼用
1.打開pycharm,新建一個python程序,命名為excel.py。
2.直接貼出代碼,如果是hello world就不存調試的問題了!
相關推薦:《Python基礎教程》
3.介紹調試的菜單操作,在【菜單欄】選擇【RUN】,下拉菜單里選擇【debug excel.py】或者【Debug...】,這兩個功能是一樣的,都是調試功能。
4.介紹快捷鍵調試,調試:CTRL+SHLFT+F9,執行是CTRL+SHLFT+F10,當前調試SHLFT+F9,當前執行SHLFT+F10,還有很多,
5.貼出調試的結果,會具體提示一些警告或者異常,因為本例已經調試過,所以沒有異常。
9. 怎麼調試python腳本
打開pycharm community 2019.1軟體,創建一個項目。
創建一個py後綴的文件作為示範,文件名自己定義。
相關推薦:《Python基礎教程》
編寫代碼,然後右鍵點擊進行運行,查看一下是否有問題。
點擊右上角的蟲子圖標,然後下面會有控制面板出來,點擊Debugger,然後我們在行號那裡選擇要調試哪一行,點擊就會有紅點。
再點擊蟲子圖標,這個時候就可以開始調試了,點擊step over或者快捷鍵f8就可以調試了。
但是我們可以看出就直接跳過函數內部,對於函數內部的調試,我們則需要點擊step into,或者快捷鍵f7,這樣才可以調試內部。
10. 如何在 Python 中使用斷點調試
在eclipse下可以單步調試python的方法:
1、右鍵單擊標尺欄添加斷點
2、將滑鼠移至需要添加斷點的代碼行,使用快捷鍵 Ctrl+F10,在彈出的菜單欄中選擇 」Add Breakpoint」 添加斷點。
添加好斷點後,選擇 Debug As -> Python Run 啟動調試器,彈出一個對話框,詢問是否切換到調試器透視圖,單擊 Yes,即顯示調試模式。
3、調試器透視圖
程序調試過程中,常用的幾個快捷鍵如下:
單步跳入 Step Into: F5
單步跳過 Step Over: F6
單步返回 Step Return: F7
重新開始 Resume: F8
在控制台 Console 中,顯示出斷點之前代碼的執行結果。如果要查看某個變數的值,以變數 a 為例,可以手動在控制台中鍵入一行代碼 」print 『a is:』, a」,再連續按兩次 Enter 鍵,即顯示出變數的值。