在Django / Python中,我如何找出调用my方法的方法?

时间:2012-01-18 21:17:27

标签: python django stack-trace

我的方法的第一行是:

print "this method was called from "+filename_and_linenumber_of_code_that_called_it.

是否可以抛出异常,立即捕获它,并在调用方法时打印堆栈跟踪?

4 个答案:

答案 0 :(得分:4)

无需抛出异常即可查看堆栈。我有这个很好的功能(它不完美,但我认为它有效)可以帮助你:

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

它打印消息,后跟父函数所在文件的名称,然后是该文件中调用的行号,然后是函数的名称。我希望它能帮到你:)。

答案 1 :(得分: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. 替换代码中的print语句
  4. 在runserver中执行你的代码,它会暂停并生成一个python shell,在那里你可以发送命令“up”转到前面的堆栈帧(代码调用你的代码)< / strong>即可。如果要查看更多代码行,请键入l

  5. 更长的开始:实际上我写了an overview of tools which help debugging python and django

    我不同意其他建议添加更精细的印刷声明的答案。 您希望成为一名优秀的开发人员:您希望使用调试器。无论是werkzeug,pdb / ipdb还是GUI,只要你能使用它就没关系。

答案 2 :(得分: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

答案 3 :(得分:0)

pdb 这样的调试器会很有帮助。请参阅下面的代码段。

def f4():
    print "in f4"

def f3():
    import pdb
    pdb.set_trace()
    f4()
    print "in f3"

def f2():
    f3()
    print "in f2"

def f1():
    f2()
    print "in f1"

f1()

进入pdb控制台后,可以输入向上命令跳转到来电者功能。

请参阅下面的屏幕截图。enter image description here