【问题标题】:Getting a python traceback without an exception毫无例外地获取python回溯
【发布时间】:2012-06-14 16:11:20
【问题描述】:

假设你有这些模块:

module1.py

​​>
import module2

def a():
    module1.b()

def c():
    print "Hi guys!"

module2.py

​​>
import module1

def b():
    module1.c()

我想要一个函数 func(a()) 产生与此类似的输出:(=a traceback ?)

 /usr/local/lib/python2.7/dist-packages/test/module1.py
   3 def a():
   4     module1.b()

   1 import module1

 /usr/local/lib/python2.7/dist-packages/test/module2.py
   3 def b():
   4     module1.c()

   1 import module2

 /usr/local/lib/python2.7/dist-packages/test/module1.py
   6 def c():
   7     print "Hi guys!"

标准模块traceback 和/或cgitb 和/或inspect 可能是可行的,但我很难从文档中找出这些模块。

我认为traceback.print_stack(a()) 是可能的,但由于某种原因它只是一直在加载。我尝试了这些模块中的其他功能,但没有成功。

更新 3

@jterrace

python trapy_module.py:

import trace

def trapy(arg):
    tracer = trace.Trace()
    tracer.run(arg)
    r = tracer.results()
    r.write_results()

if __name__ == '__main__':
    import random
    trapy('random.random()')

现在当我这样做时: python trapy_module.py我明白了:

--- modulename: trapy, funcname: <module>
<string>(1): 

import random 替换为import pyglet 并将random.random() 替换为pyglet.app.run() 只是继续运行而不输出任何内容。

【问题讨论】:

  • ITYM module2.b()from module2 import b

标签: python stack-trace pretty-print


【解决方案1】:

traceback.print_stack 非常适合我:

>>> import traceback
>>> def what():
...    traceback.print_stack()
... 
>>> def hey():
...    what()
... 
>>> hey()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in hey
  File "<stdin>", line 2, in what

更新:

您已经明确表示您真的不想要回溯。您需要跟踪信息。您可以通过以下方式获取一些跟踪信息:

#tracetest.py

def what():
    return 3

def hey():
    return what()

def yo():
    return hey()

import trace
tracer = trace.Trace()
tracer.run("yo()")
r = tracer.results()
r.write_results()

并运行上述:

$ python tracetest.py
 --- modulename: tracetest, funcname: <module>
<string>(1):   --- modulename: tracetest, funcname: yo
tracetest.py(8):     return hey()
 --- modulename: tracetest, funcname: hey
tracetest.py(5):     return what()
 --- modulename: tracetest, funcname: what
tracetest.py(2):     return 3

【讨论】:

  • 谢谢你。但我想例如无需接触pyglet项目代码即可追溯pyglet.app.run()
  • 我认为您需要跟踪模块。更新了答案。
  • 再次感谢您。这在该示例中有效,但显然不适用于其他库中的某些函数/对象实例化。你知道为什么吗?在原始帖子中查看我的更新。
  • 你是从命令行运行的吗?跟踪仅适用于文件
  • 不,你没有。 str(random.random()) 不是“random.random()”
猜你喜欢
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多