2014-12-15 1 views
3

Каждого отслеживающего пункта имеет формат, как:Где Python получить поле ввода <filename> обратного прослеживания от

File "<filename>", line xxx, in <module> 
    line 

Я заинтересован в изменении поля имени файла (что-то обычай) для некоторых модулей. Это возможно? Я пробовал изменить член __file__ объекта модуля, но это, похоже, не используется, когда python создает стек трассировки.

ответ

2

Вы можете использовать модуль inspect, чтобы получить путь к файлу многих модулей. например

>>> inspect.getabsfile(traceback) 
'/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/traceback.py' 

Зная, что отладочные происходит от traceback.print_stack(), мы можем обратиться к определению print_stack(): «? Где он определил»

279 def print_stack(f=None, limit=None, file=None): 
280  """Print a stack trace from its invocation point. 
281 
282  The optional 'f' argument can be used to specify an alternate 
283  stack frame at which to start. The optional 'limit' and 'file' 
284  arguments have the same meaning as for print_exception(). 
285  """ 
286  print_list(extract_stack(_get_stack(f), limit=limit), file=file) 

С я избавлю вас от необходимости выполнять вызовы функций и предлагаю посмотреть format_exception и relevant examples. Не зная конкретно, что вы хотите сделать с трассировкой, я бы предложил посмотреть на jinja2 source, так как он довольно много искажает трассировку.