是否有可能从鸡蛋中获取Python追溯线?

时间:2015-04-29 10:39:38

标签: python python-2.7 traceback

Python Packaging: Hate, hate, hate everywhere,Armin说:

  

[...] Python回溯不再包含带回溯的源代码行。但是,为什么它不能在那里显示正确的行号没有技术限制。这只是Python解释器中的一个错误。

我在virtualenv中看到了鸡蛋的问题:

Traceback (most recent call last):
  File "/users/example/venv/current/bin/my_script", line 37, in <module>
    sys.exit(demo.scripts.foo.main())
  File "build/bdist.linux-x86_64/egg/example/demo/scripts/my_script.py", line 90, in main
  File "build/bdist.linux-x86_64/egg/example/demo/lib/bar.py", line 18, in func_x
  File "build/bdist.linux-x86_64/egg/example/demo/lib/bar.py", line 55, in func_y
AttributeError: 'tuple' object has no attribute 'sort'

由于这是一个已知错误,是否有解决方法? Python bug跟踪器中是否存在问题(我找不到)?

1 个答案:

答案 0 :(得分:1)

这是一个概念证明

 import os
 import sys
 import traceback
 import linecache


 def recurse(depth=10):
     if depth:
         recurse(depth-1)
     os.path.join(None, None)


 def locate_filename(filename):

     def generate_segments():
         parts = filename.split(os.sep)
         for i in xrange(len(parts) - 1, 0, -1):
             yield os.sep.join(os.path.join(parts[i:]))

     for segment in generate_segments():
         for path in sys.path:
             candidate = os.path.join(path, segment)
             if os.path.exists(candidate):
                 return candidate


 try:
     recurse()
 except:
     _, _, tb = sys.exc_info()
     for filename, lineno, functionname, _ in traceback.extract_tb(tb):
         print filename, lineno, functionname
         relocated_filename = locate_filename(filename)
         if relocated_filename:
             print linecache.getline(relocated_filename, lineno)