2012-01-18 39 views

回答

3

無需拋出異常來查看堆棧。我有這個漂亮的功能(它並不完美,但我認爲它的工作原理),可以幫助你:

import inspect 
def log(error): 
    frame, filename, ln, fn, lolc, idx = inspect.getouterframes(inspect.currentframe())[1] 
    print "Error: " + error + " " + filename, ln, fn 

它打印消息後跟父功能是在文件的名稱,然後行號在這個文件中的調用,然後是函數的名稱。我希望它會幫助你:)

+0

感謝。但是,我收到一個錯誤,指出「ImportError:No module named introspect」 – Deonomo 2012-01-18 21:30:29

+0

它應該是'import inspect'。 – Wilduck 2012-01-18 21:32:13

+0

對不起!這應該是「進口檢查」,我的壞! – Maciek 2012-01-18 21:32:20

4

當我只是想讓代碼崩潰在某些時候看到回溯,我只是把「crash」代碼。由於沒有定義,它會崩潰,我會在django的異常頁面中看到回溯。如果此外,我使用runserver_plus命令提供的django-extensions(需要包werkzeug)然後我得到an AJAX shell at each frame of the stacktrace

我明白你的問題,我將提出一種處理這類問題的專業方法。 你正在做的事就是所謂的「debugging,那裏有工具。

快速入門

  1. 運行pip install ipython ipdb

  2. 更換打印語句在你的代碼通過import ipdb; ipdb.set_trace()

  3. 中的runserver執行代碼,它會暫停並生成一個蟒蛇殼在那裏你可以發送命令「up」去前一個堆棧幀(代碼c alled你的代碼)。如果您想查看更多的代碼行,請輸入l

再啓動:嗯,事實上我寫了一個an overview of tools which help debugging python and django

我不同意其他建議添加更精細的打印語句的答案。 你想成爲一名優秀的開發人員:你想使用調試器。無論是werkzeug,pdb/ipdb還是GUI,只要您可以使用它就沒有關係。

+0

謝謝 - 我一定要看調試器。現在我依靠代碼中的打印語句來完成所有的調試工作。 – Deonomo 2012-01-18 21:59:33

+0

是的,我在你之前的問題中已經看到了 - 以「如何調試」結束。瞭解調試器肯定會幫助你!請注意,您可以在代碼中的任何位置放置「import pdb; pdb.set_trace()」,它是本地python。界面只是一見鍾情,這就是爲什麼我推薦ipdb;)thruth是**圖形調試器真的很棒**,但在python中更難以設置。無論如何,我認爲這是一個非常好的問題。 – jpic 2012-01-18 22:04:19

+1

我相當肯定,使用每個打印語句進行調試目的** KILLS在世界**中的KITTEN SOMEWHERE **。你應該使用logger.debug而不是在這些情況下打印。 – jpic 2012-01-18 22:10:29

1

這是CPython的具體:

import sys 

def func(): 
    frm = sys._getframe(1) 
    print 'called from %s, line %s' % (frm.f_code.co_filename, frm.f_lineno) 

def test(): 
    func() # line 8 

test() 

打印:

called from /path/to/script.py, line 8