最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Linux下調(diào)試Python代碼的各種方法

 更新時間:2015年04月17日 11:06:40   投稿:goldensun  
這篇文章主要介紹了在Linux下調(diào)試Python代碼的各種方法,用于編程后的debug工作,需要的朋友可以參考下

 這是一個我用于調(diào)試或分析工具概述,不一定是完整全面,如果你知道更好的工具,請在評論處標(biāo)記。

日志

是的,的確,不得不強調(diào)足夠的日志記錄對應(yīng)用程序是多么的重要。您應(yīng)該記錄重要的東西,如果你的記錄足夠好的話,你可以從日志中找出問題從而節(jié)省大量的時間。

如果你曾經(jīng)用print語句來調(diào)試代碼現(xiàn)在停下吧,用logging.debug替代,開始可以慢慢來,以后完全禁用它...

追蹤
有時看到程序如何被執(zhí)行會很有幫助。你可以使用IDE的調(diào)試共軛ngn一步一步的運行程序,但你需要知道你要找的是什么,否則這將會是一個漫長的過程。
標(biāo)準(zhǔn)庫中有一個 trace模塊,可以打印所有執(zhí)行過程中的內(nèi)容(像制作 覆蓋率報告)。
 

python -mtrace --trace script.py

這將產(chǎn)生大量輸出(每個行會被打印輸出,所以你最好通過管道,用grep只看自己感興趣的部分),例如:
 

python -mtrace --trace script.py | egrep '^(mod1.py|mod2.py)'
- 

如果你喜歡新特性,那么你可以嘗試 smiley - 它可以顯示變量內(nèi)容變化,還可以用它來遠(yuǎn)程追蹤程序。

PDB
 

import pdb
pdb.set_trace() # opens up pdb prompt

或者:
 

try:
  code
  that
  fails
except:
  import pdb
  pdb.pm() # or pdb.post_mortem()

或(按鍵盤C鍵啟動腳本):
 

python -mpdb script.py

像在REPL中那樣:

  •     c or continue
  •     q or quit
  •     l or list, 在當(dāng)前界面顯示源碼
  •     w or where, 顯示回溯
  •     d or down, 顯示回溯的下一界面
  •     u or up, 顯示回溯的上一界面
  •     <enter>, 重復(fù)最后一個命令
  •     其他任何東西,在當(dāng)前界面評估源碼 (t還有其他的一些命令)
  • corcontinue
  • qorquit
  • lorlist,顯示在當(dāng)前幀的源
  • worwhere,顯示回溯
  • dordown,下山1幀回溯
  • uorup,上升1幀回溯
  • 回車,重復(fù)最后一個命令

幾乎任何東西,評估當(dāng)前幀的Python代碼(還有其他幾個命令)

可以替代pdb的:

  •     ipdb (easy_install ipdb) - 像 ipython (自動補齊, 顏色等)
  •     pudb (easy_install pudb) - 基于curses (類gui), 瀏覽源碼有很好的表現(xiàn)。

遠(yuǎn)程 PDB
 

sudo apt-get install winpdb

替代 pdb.set_trace():
 

import rpdb2
rpdb2.start_embedded_debugger("secretpassword")

現(xiàn)在運行Winpdb , 輸入密碼 到 File > Attach。
不喜歡 Winpdb ? 只要通過 TCP運行 PDB

使用下面代碼:
 

import loggging
 
class Rdb(pdb.Pdb):
  """
  This will run pdb as a ephemeral telnet service. Once you connect no one
  else can connect. On construction this object will block execution till a
  client has connected.
 
  Based on https://github.com/tamentis/rpdb I think ...
 
  To use this::
 
    Rdb(4444).set_trace()
 
  Then run: telnet 127.0.0.1 4444
  """
  def __init__(self, port=0):
    self.old_stdout = sys.stdout
    self.old_stdin = sys.stdin
    self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.listen_socket.bind(('0.0.0.0', port))
    if not port:
      logging.critical("PDB remote session open on: %s", self.listen_socket.getsockname())
      print >> sys.__stderr__, "PDB remote session open on:", self.listen_socket.getsockname()
      sys.stderr.flush()
    self.listen_socket.listen(1)
    self.connected_socket, address = self.listen_socket.accept()
    self.handle = self.connected_socket.makefile('rw')
    pdb.Pdb.__init__(self, completekey='tab', stdin=self.handle, stdout=self.handle)
    sys.stdout = sys.stdin = self.handle
 
  def do_continue(self, arg):
    sys.stdout = self.old_stdout
    sys.stdin = self.old_stdin
    self.handle.close()
    self.connected_socket.close()
    self.listen_socket.close()
    self.set_continue()
    return 1
 
  do_c = do_cont = do_continue
 
def set_trace():
  """
  Opens a remote PDB on first available port.
  """
  rdb = Rdb()
  rdb.set_trace()

想要 REPL ? IPython 怎么樣?

如果你不需要一個整體的調(diào)試器,只要啟動IPython用下面的代碼:
 

import IPython
IPython.embed()

標(biāo)準(zhǔn)Linux工具

他們未被充分利用很令我驚訝。通過這些工具集你能弄清楚諸如這些的很多問題:從性能問題(太多的系統(tǒng)調(diào)用,內(nèi)存分配等)到死鎖,網(wǎng)絡(luò),磁盤等問題。
 

sudo apt-get install htop
sudo htop

最有用的是降權(quán)運行strace,只需運行速凍 strace -P 12345 或strace-f 命令參數(shù)(-f表示strace分支進(jìn)程)。 通常有很多的輸出,你最好將輸出重定向輸出到一個文件(命令后添加 &> 文件名)來進(jìn)行更深入的分析。

然后就是ltrace,它和strace相似不過是通過庫調(diào)用的,參數(shù)基本相同。
lsof可以提供 你看過ltrace/ strace的處理號,這樣使用:lsof -P 12345


讓跟蹤更深點

它很容易使用以及可以做很多事,前提是大家都已經(jīng)安裝了htop!

現(xiàn)在,找你所想的進(jìn)程,僅僅需要按:

  •     s  顯示系統(tǒng)調(diào)用跟蹤(strace)
  •     L  顯示庫調(diào)用跟蹤(ltrace)
  •     l   顯示lsof

監(jiān)視

沒有更好的替代品了,服務(wù)器持續(xù)監(jiān)視,你曾經(jīng)是否發(fā)現(xiàn)自己使用奇奇怪怪的跟蹤方法去找出為什么哪里慢了以及資源怎么被消耗了,那么不要再被iotop, iftop, htop, iostat, vmstat等等煩擾了,趕快使用dstat吧,它可以做大多數(shù)上述的提到的工具能做的,而且可以做得更好!

它會以緊湊,時尚的代碼著色(親,不像iostat, vmstat喲)持續(xù)顯示你的數(shù)據(jù),而且你可以一直看到以往的數(shù)據(jù)(與iftop, iotop, htop不同喲)。

僅僅運行這個:
 

dstat --cpu --io --mem --net --load --fs --vm --disk-util --disk-tps --freespace --swap --top-io --top-bio-adv

還有一點就是這里還有更簡單的方式來寫喲,如shell歷史記錄(shell history)或則重命名命令(aliases)

GDB

這是一個相當(dāng)復(fù)雜和強大的工具,但我僅僅涉及到基礎(chǔ)的東西(設(shè)置和基本命令)。
 

sudo apt-get install gdb python-dbg
zcat /usr/share/doc/python2.7/gdbinit.gz > ~/.gdbinit
run app with python2.7-dbg
sudo gdb -p 12345

現(xiàn)在請使用:

    bt- 堆棧軌跡(C 級)
    pystack- python 堆棧軌跡,前提是你需要擁有~/.gdbinit 并使用python-dbg
    c(繼續(xù))

有出現(xiàn) segfaults 么 ?用 faulthandler !

除了Python 3.3其他的都會出現(xiàn)這個可怕的錯誤, 回到Python 2.x

只要按照下面來做,你至少會找到一條導(dǎo)致段錯誤的原因。
 

>>> import faulthandler
>>> faulthandler.enable()

內(nèi)存泄露

好的,這里有許多工具,其中有一些是專門用于WSGI 應(yīng)用的,像Dozer,但是我最喜歡的無疑是 objgraph。它是如此驚人的方便和易于使用。它沒有與WSGI或任何其他東西繼承,所以你需要找到你自己的方式來運行以下代碼:
 

>>> import objgraph
>>> objs = objgraph.by_type("Request")[:15]
>>> objgraph.show_backrefs(objs, max_depth=20, highlight=lambda v: v in objs, filename="/tmp/graph.png")
Graph written to /tmp/objgraph-zbdM4z.dot (107 nodes)
Image generated as /tmp/graph.png

你會得到一個像 這樣的圖表(警告:這個圖表非常大)。你也會得到 dot輸出。
 
內(nèi)存利用

有時你想使用更少的內(nèi)存。少分配內(nèi)存通常會使程序運行的更快更好,用戶們都喜歡精益求精:)

有許多工具可以拿來使用 [1] ,但在我看來最好的是pytracemalloc - 與其他工具相比較,它的開銷很?。ú恍枰蕾囉谙魅跛俣鹊?sys.settrace)并且它的輸出非常詳盡。令人頭疼的是它的配置,因為需要你重編譯python,但是spt使其很容易做到。

只要運行以下命令,然后你就可以去買午餐或者做其他事了:
 

apt-get source python2.7 cd python2.7-*
wget https://github.com/wyplay/pytracemalloc/raw/master/python2.7_track_free_list.patch
patch -p1 < python2.7_track_free_list.patch
debuild -us -uc cd ..
sudo dpkg -i python2.7-minimal_2.7*.deb python2.7-dev_*.deb

然后安裝pytracemalloc(請注意:如果你是在虛擬環(huán)境中做的這些操作,那么在python重新安裝后,你需要重建它-僅運行virtualenv myenv即可):
 

pip install pytracemalloc
 

現(xiàn)在,你就可以通過以下代碼來封裝你的應(yīng)用程序:
 

import tracemalloc, time
tracemalloc.enable()
top = tracemalloc.DisplayTop(
  5000, # log the top 5000 locations
  file=open('/tmp/memory-profile-%s' % time.time(), "w")
)
top.show_lineno = True
try:
  # code that needs to be traced
finally:
  top.display()

會得到像下面這樣的輸出:
 

2013-05-31 18:05:07: Top 5000 allocations per file and line
#1: .../site-packages/billiard/_connection.py:198: size=1288 KiB, count=70 (+0), average=18 KiB
#2: .../site-packages/billiard/_connection.py:199: size=1288 KiB, count=70 (+0), average=18 KiB
#3: .../python2.7/importlib/__init__.py:37: size=459 KiB, count=5958 (+0), average=78 B
#4: .../site-packages/amqp/transport.py:232: size=217 KiB, count=6960 (+0), average=32 B
#5: .../site-packages/amqp/transport.py:231: size=206 KiB, count=8798 (+0), average=24 B
#6: .../site-packages/amqp/serialization.py:210: size=199 KiB, count=822 (+0), average=248 B
#7: .../lib/python2.7/socket.py:224: size=179 KiB, count=5947 (+0), average=30 B
#8: .../celery/utils/term.py:89: size=172 KiB, count=1953 (+0), average=90 B
#9: .../site-packages/kombu/connection.py:281: size=153 KiB, count=2400 (+0), average=65 B
#10: .../site-packages/amqp/serialization.py:462: size=147 KiB, count=4704 (+0), average=32 B
 
...

相關(guān)文章

  • pyv8學(xué)習(xí)python和javascript變量進(jìn)行交互

    pyv8學(xué)習(xí)python和javascript變量進(jìn)行交互

    這篇文章主要介紹了pyv8學(xué)習(xí)python和javascript變量進(jìn)行交互,python取得javascript里面的值、javascript取得python里面的值、python和javascript里面的函數(shù)交互
    2013-12-12
  • python中array數(shù)組添加一行或一列數(shù)據(jù)的具體實現(xiàn)

    python中array數(shù)組添加一行或一列數(shù)據(jù)的具體實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于python中array數(shù)組添加一行或一列數(shù)據(jù)的具體實現(xiàn),最近經(jīng)常使用到數(shù)組方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 淺析Python中的方法重載

    淺析Python中的方法重載

    方法重載在?Python?中起著至關(guān)重要的作用,?這篇文章主要為大家詳細(xì)介紹了Python中方法重載及其優(yōu)點的相關(guān)知識,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-10-10
  • 淺談pyqt5在QMainWindow中布局的問題

    淺談pyqt5在QMainWindow中布局的問題

    今天小編就為大家分享一篇淺談pyqt5在QMainWindow中布局的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 淺析Python中的縮進(jìn)錯誤

    淺析Python中的縮進(jìn)錯誤

    在編程中,我們經(jīng)常會遇到錯誤,縮進(jìn)錯誤是 Python 中最常見的錯誤之一,它會使我們的代碼難以理解,并且難以調(diào)試,下面小編就來和大家簡單聊聊Python中的縮進(jìn)錯誤吧
    2023-10-10
  • Django認(rèn)證系統(tǒng)user對象實現(xiàn)過程解析

    Django認(rèn)證系統(tǒng)user對象實現(xiàn)過程解析

    這篇文章主要介紹了Django認(rèn)證系統(tǒng)user對象實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Python基于plotly模塊實現(xiàn)的畫圖操作示例

    Python基于plotly模塊實現(xiàn)的畫圖操作示例

    這篇文章主要介紹了Python基于plotly模塊實現(xiàn)的畫圖操作,涉及Python基于plotly模塊的數(shù)值運算與圖形操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-01-01
  • Python偏函數(shù)介紹及用法舉例詳解

    Python偏函數(shù)介紹及用法舉例詳解

    偏函數(shù)(Partial function)是Python的functools模塊提供的一個很有用的功能,它允許我們通過固定部分參數(shù)或關(guān)鍵字參數(shù)來創(chuàng)建一個新的函數(shù),這篇文章主要給大家介紹了關(guān)于Python偏函數(shù)介紹及用法舉例詳解的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • 利用python實現(xiàn)聚類分析K-means算法的詳細(xì)過程

    利用python實現(xiàn)聚類分析K-means算法的詳細(xì)過程

    K-means算法是很典型的基于距離的聚類算法,采用距離作為相似性的評價指標(biāo),即認(rèn)為兩個對象的距離越近,其相似度就越大,下面通過本文給大家介紹利用python實現(xiàn)聚類分析K-means算法的詳細(xì)過程,感興趣的朋友一起看看吧
    2021-11-11
  • python 按鈕點擊關(guān)閉窗口的實現(xiàn)

    python 按鈕點擊關(guān)閉窗口的實現(xiàn)

    這篇文章主要介紹了python 按鈕點擊關(guān)閉窗口的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03

最新評論

永寿县| 卓资县| 酉阳| 广元市| 盐山县| 洱源县| 邯郸县| 繁峙县| 江华| 剑河县| 梅河口市| 泗洪县| 曲麻莱县| 重庆市| 泗水县| 莒南县| 岳普湖县| 澎湖县| 万年县| 马边| 香港| 滦平县| 梅河口市| 高安市| 水富县| 鄂伦春自治旗| 甘德县| 绥化市| 绥中县| 铁岭市| 荔波县| 山东省| 宜州市| 淮滨县| 上高县| 本溪| 怀远县| 龙海市| 太原市| 洪泽县| 大洼县|