繁体   English   中英

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

[英]In Django/Python, how can I find out which method called my method?

我的方法的第一行是:

print "this method was called from "+filename_and_linenumber_of_code_that_called_it.

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

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

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

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

当我只想让代码在某些时候崩溃以查看回溯时,我只是在代码中放入“ crash ”。 因为它没有定义,它会崩溃,我将在django的异常页面中看到回溯。 如果另外,我使用django-extensions提供的runserver_plus命令(需要包werkzeug ),然后我在stacktrace的每一帧获得一个AJAX shell

我理解你的问题,我将提出一种处理这类问题的专业方法。 你要做的是被称为“ 调试 ,有一些工具。

快速入门

  1. 运行pip install ipython ipdb

  2. 通过import ipdb; ipdb.set_trace()替换代码中的print语句import ipdb; ipdb.set_trace() import ipdb; ipdb.set_trace()

  3. 在runserver中执行你的代码,它会暂停并生成一个python shell,你可以发送命令“ up ”转到前一个堆栈帧(代码调用你的代码) 如果要查看更多代码行,请键入l

更长的开始 :实际上我写了一个帮助调试python和django的工具概述

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

这是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

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控制台后,可以输入up命令跳转到调用者函数。

请参阅下面的截图 在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM